\input texinfo @c -*-texinfo-*-
@comment %**start of header
@setfilename bison.info
@include version.texi
@settitle Bison @value{VERSION}
@setchapternewpage odd

@finalout

@c SMALL BOOK version
@c This edition has been formatted so that you can format and print it in
@c the smallbook format.
@c @smallbook

@c Set following if you have the new `shorttitlepage' command
@c @clear shorttitlepage-enabled
@c @set shorttitlepage-enabled

@c Set following if you want to document %default-prec and %no-default-prec.
@c This feature is experimental and may change in future Bison versions.
@c @set defaultprec

@c ISPELL CHECK: done, 14 Jan 1993 --bob

@c Check COPYRIGHT dates.  should be updated in the titlepage, ifinfo
@c titlepage; should NOT be changed in the GPL.  --mew

@c FIXME: I don't understand this `iftex'.  Obsolete? --akim.
@iftex
@syncodeindex fn cp
@syncodeindex vr cp
@syncodeindex tp cp
@end iftex
@ifinfo
@synindex fn cp
@synindex vr cp
@synindex tp cp
@end ifinfo
@comment %**end of header

@copying

����ֲ������@acronym{GNU} Bison (�汾@value{VERSION},@value{UPDATED}),
@acronym{GNU}������������.

Copyright @copyright{} 1988, 1989, 1990, 1991, 1992, 1993, 1995, 1998,
1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.

Chinese(zh_CN) translation:Xiao Wang

@quotation
Permission is granted to copy, distribute and/or modify this document
under the terms of the @acronym{GNU} Free Documentation License,
Version 1.1 or any later version published by the Free Software
Foundation; with no Invariant Sections, with the Front-Cover texts
being ``A @acronym{GNU} Manual,'' and with the Back-Cover Texts as in
(a) below.  A copy of the license is included in the section entitled
``@acronym{GNU} Free Documentation License.''

(a) The @acronym{FSF}'s Back-Cover Text is: ``You have freedom to copy
and modify this @acronym{GNU} Manual, like @acronym{GNU} software.
Copies published by the Free Software Foundation raise funds for
@acronym{GNU} development.''
@end quotation
@end copying

@dircategory GNU programming tools
@direntry
* bison: (bison).       @acronym{GNU} parser generator (Yacc replacement).
@end direntry

@ifset shorttitlepage-enabled
@shorttitlepage Bison
@end ifset
@titlepage
@title Bison
@subtitle The Yacc-compatible Parser Generator
@subtitle @value{UPDATED}, Bison Version @value{VERSION}

@author by Charles Donnelly and Richard Stallman
@author translated(zh_CN) by Xiao Wang

@page
@vskip 0pt plus 1filll
@insertcopying
@sp 2
Published by the Free Software Foundation @*
59 Temple Place, Suite 330 @*
Boston, MA  02111-1307  USA @*
Printed copies are available from the Free Software Foundation.@*
@acronym{ISBN} 1-882114-44-2
@sp 2
Cover art by Etienne Suvasa.
@end titlepage

@contents

@ifnottex
@node Top
@top Bison
@insertcopying
@end ifnottex

@menu
* ����(Introduction):Introduction.
* ʹ������(Conditions):Conditions.
* ��Ȩ(Copying):Copying.           @acronym{GNU} General Public License
                             ˵���������ʹ�ú͹���Bison

��ѧ�½�:
* ����(Concepts):Concepts.          ����Bison�Ļ�������.
* ����(Examples):Examples.          ������ϸ���͵�ʹ��Binson������.

�ο��½�:
* �﷨�ļ�(Grammar File):Grammar File.      ��дBison�����͹���.
* �ӿ�(Interface):Interface.         ����������@code{yyparse}��C���Խӿ�.
* �㷨(Algorithm):Algorithm.         Bison����������ʱ��ι���.
* ����ָ�(Error Recovery):Error Recovery.    ��д����ָ�����.
* ����������(Context Dependency):Context Dependency.  ���������Ե��﷨��������������Bison����ֱ�Ӵ���,�����ô��.
* ����(Debugging):Debugging.         ��������Bison������.
* ����(Invocation):Invocation.        �������Bison(�����ɷ���Դ�ļ�).
* ���ű�(Table of Symbols):Table of Symbols.  ��������Bison���ԵĹؼ���.
* �ʻ��(Glossary):Glossary.          ���ͻ�������.
* �������(FAQ):FAQ.               ��������
* ��������ֲ�(Copying This Manual):Copying This Manual.  ��������ֲ������
* ����(Index):Index.             �ı���������

@detailmenu
 --- ��ϸ�ڵ��б� ---

Bison�Ļ�������-The Concepts of Bison

* �������ķ�(Language and Grammar):Language and Grammar.  ����ѧ�ĸ������������Ժ��������޹��ķ�.
* Bison�е��﷨(Grammar in Bison):Grammar in Bison.  ������Bison���﷨��ʾ�����ķ�.
* ����ֵ(Semantic Values):Semantic Values.   ÿ���ǺŻ����﷨�����һ������ֵ(����:��������ֵ,��ʶ�������Ƶȵ�)
* ���嶯��(Semantic Actions):Semantic Actions.  ÿ���������һ������C����Ķ���
* GLR������(GLR Parsers):GLR Parsers.       Ϊ��ͨ���������޹��ķ���д������
* λ�ø���(Locations Overview):Locations Overview.    ׷��λ��
* Biosn�ķ�����(Bison Parser):Bison Parser.      Bison������������ʲô,����ʹ��Bison�����
* ����:Stages.            ��д������Bison�﷨�������������.
* �﷨�ļ��Ĳ���(Grammar Layout):Grammar Layout.    Bison�﷨�ļ������岼��

��д@acronym{GLR}������-Writing @acronym{GLR} Parsers

* �򵥵�GLR������(Simple GLR Parsers):Simple GLR Parsers.          ʹ��@acronym{GLR}�����������������ķ�
* �ɺϲ���GLR������(Merging GLR Parsers):Merging GLR Parses.          ʹ��@acronym{GLR}�������������
* �Ա�������Ҫ��(Compiler Requirements):Compiler Requirements.       @acronym{GLR}��������Ҫһ���ִ���C������

ʵ��-Examples

* RPN������(RPN Calc):RPN Calc.          �沨���Ǻż�����,���ǵĵ�һ������,�������в��������ȼ�
* ��׺������(Infix Calc):Infix Calc.        ��׺�������ż�����,�򵥵ؽ��ܲ��������ȼ�.
* �򵥵Ĵ���ָ�(Simple Error Rcovery):Simple Error Recovery.  �ڳ����﷨������������
* λ��׷�ټ�����(Location Tracking Calc):Location Tracking Calc. չʾ@@@var{n}��@@$���÷�
* �๦�ܼ�����(Multi-function Calc):Multi-function Calc.  ���д洢�ʹ������ܵļ�����.��ʹ���˶���������������ʾ����ֵ.
* ��ϰ(Exercises):Exercises.         һЩ�Ľ��๦�ܼ������ķ���

�沨���Ǻż�����-Reverse Polish Notation Calculator

* ����(Decls): Rpcalc Decls.  rpclac��Prologue(����)����.
* ����(Rules): Rpcalc Rules.  ��ע�͵�rpcalc�﷨����
* �ʷ�������(Lexer): Rpcalc Lexer.  �ʷ�������
* ������(Main): Rpcalc Main.    ���ƺ���
* ����(Error): Rpcalc Error.  ���󱨸�Ĺ���
* ����(Gen): Rpcalc Gen.      ʹ��Bison���ɷ�����
* ����(Comp): Rpcalc Compile. ʹ��C����������õ����ս��

@code{rpcalc}���﷨����-Grammar Rules for @code{rpcalc}

* Rpcalc Input::
* Rpcalc Line::
* Rpcalc Expr::

λ��׷�ټ�����:@code{ltcalc}-Location Tracking Calculator: @code{ltcalc}

* Decls: Ltcalc Decls.  ltcalc��Bison��C���Ե�����
* Rules: Ltcalc Rules.  ��ϸ����ltcalc���﷨����
* Lexer: Ltcalc Lexer.  �ʷ�������

�๦�ܼ�����:@code{mfcalc}-Multi-Function Calculator: @code{mfcalc}

* Decl: Mfcalc Decl.      �๦�ܼ�������Bison����
* Rules: Mfcalc Rules.    ���������﷨����
* Symtab: Mfcalc Symtab.  ���ű���������

Bison�﷨�ļ�-Bison Grammar Files

* �﷨���(Grammar Outline):Grammar Outline.   �﷨�ļ������岼��
* ����(Symbols):Symbols.           �ս������ս��
* ����(Rules):Rules.             ��α�д�﷨����
* �ݹ�(Resursion):Recursion.         ��д�ݹ����
* ����(Semantics):Semantics.         ����ֵ�Ͷ���
* λ��(Locations):Locations.         λ�úͶ���
* ����(Declarations):Declarations.      ���������Bison��������������
* ���������(Multiple Parsers):Multiple Parsers.  �����Bison����������һ��������

Bison�﷨���-Outline of a Bison Grammar

* Prologue::          Prologue���ֵ��﷨��ʹ��
* Bison Declarations::  Bison declarations���ֵ��﷨��ʹ��
* Grammar Rules::     Grammar Rules���ֵ��﷨��ʹ��
* Epilogue::          Epilogue���ֵ��﷨��ʹ��

�������Ե�����-Defining Language Semantics

* ֵ����(Value Type):Value Type.        Ϊ���е�����ֵָ��һ������.
* ��������(Multiple Types):Multiple Types.    ָ�����ֿ�ѡ����������.
* ����(Actions):Actions.           ������һ���﷨��������嶨��.
* ��������(Action Types):Action Types.      Ϊ����ָ��һ��Ҫ��������������.
* �����м�Ķ���(Mid-Rule Actions):Mid-Rule Actions.  ���������ڹ���֮��,
                                           ��һ�ڽ���ʲôʱ���Լ�ΪʲôҪʹ�ù����м䶯��������.

׷��λ��-Tracking Locations

* λ������:Location Type.               ����λ�õ���������.
* ������λ��:Actions and Locations.       �ڶ�����ʹ��λ��.
* λ�õ�Ĭ�϶���:Location Default Action.     ������һ������λ�õ�ͨ�÷���.

Bison����-Bison Declarations

* ��������(Token Decl):Token Decl.        �����ս��
* ���ȼ�����(Precedence Decl):Precedence Decl.   �����ս�������ȼ��ͽ����
* ����������(Union Decl):Union Decl.        ����һ������ֵ����
* ��������(Type Decl):Type Decl.         �������ս�����ֵ������
* ��ʼ��������(Initial Action Decl):Initial Action Decl.  �ڷ�����ʼǰִ�еĴ���
* ��������(Destructor Decl):Destructor Decl.   ��������ͷŷ���
* ��������(Expect Decl):Expect Decl.       ����������ͻʱ�ľ���
* ��ʼ��������(Start Decl):Start Decl.        ָ����ʼ����
* Pure Decl:Pure Decl.         ����һ��������ķ�����
* �������ܽ�(Decl Summary):Decl Summary.      һ������Bison�������ܽ�

������C���Խӿ�-Parser C-Language Interface

* ����������(Parser Function):Parser Function.   ��ε���@code{yyparse}�Լ����ķ���ֵ.
* �ʷ�(Lexical):Lexical.           ����ṩһ������Ǻŵĺ���@code{yylex}.
* ���󱨸�(Error Reporting):Error Reporting.   ������ṩһ������@code{yyerror}.
* ��������(Action Feature):Action Features.   �ڶ�����ʹ�õ���������.

�ʷ�����������@code{yylex}-The Lexical Analyzer Function @code{yylex}

* ���ù���(Calling Convention):Calling Convention.  @code{yyparse}��ε���@code{yylex}.
* �Ǻ�ֵ(Token Values):Token Values.      @code{yylex}����η������Ѿ�����ļǺŵ�����ֵ.
* �Ǻ�λ��(Token Locations):Token Locations.   ���������Ҫ,@code{yylex}����η��ؼǺŵ�����λ��(�к�,�ȵ�).
* ������(Pure Calling):Pure Calling.      ���ù����������һ����������
                                          (@pxref{Pure Decl, ,һ����(������)������-A Pure (Reentrant) Parser}).

Bison�������㷨-The Bison Parser Algorithm

* ��ǰɨ��Ǻ�(Look-Ahead):Look-Ahead.        ��������������ʲô��ʱ�����鿴��һ���Ǻ�.
* �ƽ�/��Լ(Shift/Reduce):Shift/Reduce.      ��ͻ:�ƽ��͹�Լ����Ч.
* ���ȼ�(Precedence):Precedence.        ���ڽ����ͻ�Ĳ��������ȼ�.
* ���������ȼ�(Contextual Precedence):Contextual Precedence.  ��һ�������������ȼ�����������.
* ������״̬(Parser States):Parser States.     ��������һ������ջ������״̬��.
* ��Լ/��Լ(Reduce/Reduce):Reduce/Reduce.     ��ͬ������¿���Ӧ����������.
* �����Ի�ĳ�ͻ(Mystery Conflicts):Mystery Conflicts.  ��������ƽ�ȵĹ�Լ/��Լ��ͻ.
* ͨ��LR����(Generalized LR Parsing):Generalized LR Parsing.  ����arbitrary�������޹��ķ�.
* ջ���(Stack Overflow):Stack Overflow.    ��ջ���ʱ�����������Լ���α�����.

���������ȼ�-Operator Precedence

* Ϊʲô��Ҫ���ȼ�(Why Precedence):Why Precedence.    һ��չʾΪʲô��Ҫ���ȼ�������
* ʹ�����ȼ�(Using Precedence):Using Precedence.  ��Bison���﷨�����ָ�����ȼ�
* ���ȼ�������(Precedence Example):Precedence Examples.  ��Щ������ǰ���������������ʹ�õ�
* ���ȼ��Ĺ�����ʽ(How Precedence):How Precedence.    ������ι���

��������������-Handling Context Dependencies

* ����Ǻ�(Semantic Tokens):Semantic Tokens.   �ԼǺŵķ�����������������������.
* �ʷ�����(Lexcial Tie-ins):Lexical Tie-ins.   �ԼǺŵķ�����������������.
* �����ָ�(Tie-in Recovery):Tie-in Recovery.   �ʷ�����������α�д����ָ�����İ�ʾ.

������ķ�����-Debugging Your Parser

* ����(Understanding):Understanding.     ������ķ������Ľṹ
* ����(Tracing):Tracing.           ������ķ�������ִ��

����Bison-Invoking Bison

* Bisonѡ��(Bison Options):Bison Options.     ����дѡ�����ĸ˳����ϸ��������ѡ��
* ѡ����(Option Cross Key):Option Cross Key.  ����ĸ˳���г���ѡ��
* Yacc��(Yacc Library):Yacc Library.      ��Yacc���ݵ�@code{yylex}��@code{main}

��������-Frequently Asked Questions

* ������ջ���(Parser Stack Overflow):Parser Stack Overflow.      ͻ��ջ����
@c bad translation
* ����θ�λ������(How Can I Reset the Parser):How Can I Reset the Parser. @code{yyparse}����һЩ״̬
@c up
* �����ַ���(Strings are Destroyed):Strings are Destroyed.      @code{yylval}�������ַ�����׷��
* C++������(C++ Parsers):C++ Parsers.                ʹ��C++���������������
* ʵ��Gotos/Loops(Imlementing Gotos/Loops):Implementing Gotos/Loops.   �ڼ������п�����

��������ĵ�-Copying This Manual

* GNU Free Documentation License::  ��������ֲ������.

@end detailmenu
@end menu

@node Introduction
@unnumbered Bison���-Introduction
@cindex ���(introduction)

@dfn{Bison}��һ��ͨ��Ŀ�ĵķ�����������.
����@acronym{LALR}(1)�������޹��ķ�������ת���ɷ������ķ���C����.
һ���㾫ͨ@acronym{Bison},
������������ɴӼ򵥵���������������ӵĳ���������Եȵ��������Եķ�����.

Bison���ϼ���Yacc:������д��ȷ��Yacc�﷨��Ӧ�ÿ��Բ��Ӹ��ĵ���Bisonһ����.
��ϤYacc�����ܺ���������ʹ��Bison.
��Ӧ������������C�����������,���������ʹ��Bison����������ֲ�.

���ǻ�������̵̳�������½���BIson�Ļ�������,����չʾ������ϸ���͵�����,
��Щ���ӽ��ڽ̵̳���󱻹���.
������Bison����Yaccһ����֪,
��Ӧ�������Ķ���Щ�½�.
�������Ĳ����½���ϸ�ز�����Bison�ĸ�������.

Bison��Ҫ��Rovert Corbett��д.Richard Stallmanʹ����Yacc����.
Carnegie Mellon��ѧ��Wilfred HansenΪBison������
���ַ��ַ�������(multi-character string literals)������һЩ����.

����汾��������Ҫ��Bison@value{VERSION}��һ��.
@node Conditions
@unnumbered ʹ��Bison������-Conditions for Using Bison

Ϊ�����������ɳ���(nonfree programs)ʹ��Bison���ɵ�LALR������C����,
������Bison�汾1.24��ʱ�Ѿ��޸���@code{yyparse}�ķ�������(distribution terms for yyparse).
����֮ǰ,��Щ������ֻ��������������(free software)�ĳ���.

����@acronym{GNU}��̹���,����@acronym{GNU} C��������δ�й����Ƶ�Ҫ��.
�����������ڷ����������ķ���.
Bison�����ǲ�ͬ��ԭ�򲢲��ǳ���������Եľ���,
��������Ӧ��ͨ������֤(General Public License)�����е�BisonԴ������ɵĽ��.

Bison���ߵ����-Ҳ����Bison�������ļ�(the Bison parser file)������С���̶���Bison����Ƭ��.
��Щ����Ƭ����Դ��yyparse����.(����﷨�Ķ�����Bison���뵽���������ĳ��λ��,
���Ǻ��������ಿ�ֲ�δ����).������Ӧ��GPL���yyparse�Ĵ����ʱ��,
��������Ч������Bison�����ֻ�ܵ���������.

���ǲ�δ��������ʹ���ڶ���Щϣ��������˽�л����˵�ͬ��.
@strong{���е�������Ӧ������������.}�������ǵĽ�����:
ʹBisonֻ��������������,��Թ�������ʹ����������Ϊ��������������΢.
�������Ǿ�����ʹ��Bison��������ʹ������@acronym{GNU}���ߵ�������һ��.
(ע:����@acronym{GCC}һ���������ڷ���������).

�������������Bison����@acronym{LALR}(1)��������C����ʱ����.
����,@acronym{GPL}������Ȼ������ִ��.
�����ͨ���鿴����,�����Ƿ���������˵��``As a special execption, when
this file is copied by Bison into a Bison output file, you may use that
output file without restriction.''���ֱ���������Ƿ����������@samp{.c}����ļ�.
@include gpl.texi

@node Concepts
@chapter ��Bison��ص�һЩ��������-The Concepts of Bison

��һ�½����������������,��û���ἰһЩ�о�������ϸ��.
����㲢���˽����ʹ��Bison/Yacc,���ǽ�������ϸ�Ķ���һ��.

@menu
* �������ķ�(Language and Grammar):Language and Grammar.  ����ѧ�ĸ������������Ժ��������޹��ķ�.
* Bison�е��﷨(Grammar in Bison):Grammar in Bison.  ������Bison���﷨��ʾ�����ķ�.
* ����ֵ(Semantic Values):Semantic Values.   ÿ���ǺŻ����﷨�����һ������ֵ(����:��������ֵ,��ʶ�������Ƶȵ�)
* ���嶯��(Semantic Actions):Semantic Actions.  ÿ���������һ������C����Ķ���
* GLR������(GLR Parsers):GLR Parsers.       Ϊ��ͨ���������޹��ķ���д������
* λ�ø���(Locations Overview):Locations Overview.    ׷��λ��
* Biosn�ķ�����(Bison Parser):Bison Parser.      Bison������������ʲô,����ʹ��Bison�����
* ����:Stages.            ��д������Bison�﷨�������������.
* �﷨�ļ��Ĳ���(Grammar Layout):Grammar Layout.    Bison�﷨�ļ������岼��
@end menu

@node Language and Grammar
@section �������������޹��ķ�-Languages and Context-Free Grammars

@cindex �������޹��ķ�(context-free grammar)
@cindex �ķ�(grammar), �������޹�(context-free)
Ϊ��ʹBison�ܷ�������,�������Ա�����@dfn{�������޹��ķ�(context-free grammar)}����.
Ҳ����˵,�����ָ��һ�����߶��@dfn{�﷨��(syntactic groupings)}�Լ����﷨��Ĳ��ֹ����Ľ�����Ĺ���.
����,��C������,��һ�����ǳ�֮Ϊ`����ʽ(expression)'���﷨��.
һ�����ɱ���ʽ�Ĺ��������``һ������ʽ��һ�����ź���һ������ʽ����''.
����һ�����������``һ������ʽ������һ������''.
�����㿴����һ��,���򾭳��ǵݹ鶨���,���Ǳ�����һ�������ݹ�Ĺ���.

@cindex @acronym{BNF}
@cindex Backus-Naur ��ʽ(Backus-Naur form)
���ڱ�ʾ��Щ��������ձ��ϵͳ��@dfn{Backus-Naur ��ʽ(Backus-Naur Form)}����``@acronym{BNF}''.
�����������Ե�Ŀ������������Algol 60.
�κ���@acronym{BNF}��ʾ���ķ�����һ���������޹��ķ�.
BisonҪ�����ĵ����������@acronym{BNF}��ʾ.

@cindex @acronym{LALR}(1) �ķ�(@acronym{LALR}(1) grammars)
@cindex @acronym{LR}(1) �ķ�(@acronym{LR}(1) grammars)
�������޹��ķ���������Ҫ���Ӽ�.����Bison���Դ����������е��������޹��ķ�,
��Bison���@acronym{LALR}(1) �ķ�(@acronym{LALR}(1) grammars)�����Ż�.
�����֮,����Щ�ķ���(ע:ָLALR(1)),���ǿ��Ը�֮��η���������һ����ǰɨ��Ǻŵ������ַ��������ⲿ��.
�ϸ��˵,����һ��@acronym{LR}(1)�ķ�������.
@acronym{LALR}(1)������������Է����Ķ�������.
���˵���,��ʵ����,���Ǻ����ҵ�һ����@acronym{LR}(1)�ķ�������@acronym{LALR}(1)�ķ�������.
����@ref{Mystery Conflicts, ,���صĹ�Լ/��Լ��ͻ-Mysterious Reduce/Reduce Conflicts},�Ի�ȡ������Ϣ.

@cindex @acronym{GLR} ����(@acronym{GLR} parsing)
@cindex ͨ��@acronym{LR}(@acronym{GLR})����(generalized @acronym{LR} (@acronym{GLR}) parsing)
@cindex �����ķ�(ambiguous grammars)
@cindex ��ȷ���Է���(non-deterministic parsing)

@acronym{LALR}(1)�ķ�����������@dfn{ȷ����(deterministic)},
�����ζ��Ӧ�����������һ���ķ�����ȡ����֮ǰ�������ȷ���Ĳ���ʣ������(���ǳ�֮Ϊһ��@dfn{��ǰɨ��Ǻ�(look-ahead)}.
һ���������޹��ķ���������@dfn{�����(ambiguous)},�����ܿ���Ӧ�ö��ֹ�������ȡĳЩ����.
��ʹ���������ķ�Ҳ����ʹ@dfn{��ȷ��(non-deterministic)}��,
��û���������Ծ�����һ��Ӧ�õ��ķ������ȷ���ĳ�ǰɨ��Ǻš�
ʹ����֪��@acronym{GLR}����,Bison��@acronym{GLR}�Ϳ��Է�����Щ��Ϊ��ͨ���������޹��ķ�.
����������ַ����Ŀ��ܵķ�����ȷ���������,Bison���Դ��������������޹��ķ�.

@cindex ����(symbols (abstract))
@cindex �Ǻ�(token)
@cindex �﷨��(syntactic grouping)
@cindex ���(grouping),�﷨��(syntactic)
����ʽ�������﷨������,ÿһ���﷨��Ԫ����ϱ���֮Ϊ@dfn{����(symbol)}.
��Щ����ͨ���﷨���򱻷ֽ�ɸ�С�Ľṹ�ķ��Ž���@dfn{���ս��(nonterminal symbols)}.
��Щ���ܱ��ٷֵķ��Ž���@dfn{�ս��(terminal symbols)}����@dfn{�Ǻ�����(token types)}.
���ǰ�ͬ�ս�����Ӧ������Ƭ�ν���@dfn{�Ǻ�(token)},
��ͬ�������ս�����Ӧ������Ƭ�ν���@dfn{��(grouping)}.

���ǿ���ʹ��C������Ϊ����������ʲô�Ƿ���,�Լ��ս���ͷ��ս���ĺ���.
C���ԵļǺŰ�����ʶ��,����(���ֻ����ַ���)�Լ����ֹؼ���,��ѧ�������ͱ�����.
����C�����﷨���ս������`identifier',`number',`string',����ÿ���ؼ��ֵķ���,���������߱�����.
����:`if',`return',`const',`static',`int',`char',`plus-sign',`open-brace',`close-brace',`comma'�Լ�����.
(��Щ�Ǻſ����ٷ�Ϊ�ַ�,������Щ�Ǵʷ�ѧ�������﷨ѧ������)

����һ����ν�C�����ֽ�ɼǺŵ�����:

@ifinfo
@example
int             /* @r{�ؼ��� `int'} */
square (int x)  /* @r{identifier, open-paren, �ؼ��� `int',}
                   @r{identifier, close-paren} */
@{               /* @r{open-brace} */
  return x * x; /* @r{�ؼ��� `return', identifier, asterisk,
                   identifier, semicolon} */
@}               /* @r{close-brace} */
@end example
@end ifinfo
@ifnotinfo
@example
int             /* @r{�ؼ��� `int'} */
square (int x)  /* @r{identifier, open-paren, �ؼ��� `int', identifier, close-paren} */
@{               /* @r{open-brace} */
  return x * x; /* @r{�ؼ��� `return', identifier, asterisk, identifier, semicolon} */
@}               /* @r{close-brace} */
@end example
@end ifnotinfo

C���Ե��﷨���������ʽ,���,�����ͺ�������.
��Щ��C�����﷨�еķ��ս��`expression',`statement',`declaration'��`funcation definition'��ʾ.
�������﷨��ʹ���������������Խṹ,ÿ�ֽṹ�����Լ��ķ��ս������ʾ�������ֵĺ���.
�����������һ�������Ķ���,��������һ��������һ�����.
ÿһ��@samp{x}һ������ʽ,����@samp{x * X}Ҳ��һ������ʽ.

ÿһ�����ս��������һ����������ɸ��򵥽ṹ���������ս�����﷨����.
����,һ��C�������@code{return}���ķ���ʽ���ｫ�����µ��﷨��������:

@quotation
һ����������һ��`return'�ؼ���,һ��`expression'���Ը�`semicolon'���.
@end quotation

@noindent
��������������Ӧ`statement'�Ĺ���,ÿһ�ֹ����Ӧһ��C���.

@cindex ��ʼ����(start symbol)
���Ǳ���ע�⵽һ������ķ��ս��,���ַ��ս�����������Ե�һ����������.
���ǳ�֮Ϊ@dfn{��ʼ����(start symbol)}.
�ڱ�������,����ζ��һ���������������.
��C������,���ս��`sequence of definitions and declarations'�����������ɫ.

����,@samp{1+2}���Ը���Ч��C����ʽ---һ����Ч��C����Ĳ���---����������Ϊһ��C�����@emph{ȫ��(entire)}.
��C���Ե��������޹��ķ���,����ѭ��`expression'���ǿ�ʼ���ŵ���ʵ.

Bison��������ȡһ���Ǻ�������Ϊ�������벢ʹ���﷨���򽫼Ǻ����.
�����������Ч��,���յĽ���ǽ��������������з�����������ʼ����.
�������ʹ��C���Ե��﷨,���������������һ��`sequence of definitions and declarations',
����������ᱨ��һ���﷨����.

@node Grammar in Bison
@section �������ķ�ת����Bison������-From Formal Rules to Bison Input
@cindex Bison�﷨(Bison grammar)
@cindex �﷨(grammar), Bison
@cindex �����ķ�(formal grammar)

�����ķ���һ����ѧ�ṹ.Ϊ�˶���BisonҪ����������,
�������Bison�﷨��дһ����������Ե��ļ�,��һ��@dfn{Bison �﷨(Bison grammar)}�ļ�.
@xref{Grammar File, ,Bison���﷨�ļ�-Bison Grammar Files}.

����C�����еı�ʶ��һ��,��Bison��������,һ�������ķ��ķ��ս����һ����ʶ����ʾ.
���ݹ���,���ս��Ӧ����Сд��ĸ��ʾ,����@code{expr},@code{stmt}����@code{declaration}.

��Bison��,�ս��Ҳ����Ϊ@dfn{��������(token type)}.
��������Ҳ����������C���Ա�ʶ������ʾ.
���ݹ���,��Щ��ʶ������ô�д��ĸ��ʾ���������ͷ��ս��.
����,@code{INTEGER},@code{INDENTIFIER},@code{IF}����@code{RETURN}.
һ����ʾĳ���Ե��ض��ؼ��ֵ��ս��Ӧ���ɽ���ùؼ���֮������Ĵ�д��ʾ������.
�ս��@code{error}������������ָ�֮��.
@xref{Symbols, ,����-Symbols}.

һ���ս��Ҳ������һ����C�е��ַ�����һ����һ���ַ�����ʾ.
��һ���Ǻž���һ���ַ�(����,�Ӻŵȵ�)��ʱ��,�����������:
ʹ��ͬһ���ַ���Ϊ�Ǹ��Ǻŵ��ս��.

�����ֱ�ʾ�ս���ķ�����ʹ�ð���һЩ�ַ���C�ַ�������.
��ȡ�����ⷽ�����Ϣ����@xref{Symbols, ,����-Symbols}.

�﷨������Bison�﷨��Ҳ����Ӧ�ı�ʾ.����,������һ��C����@code{return}���Ĺ���.
�������еķֺ�,��һ���ַ��Ǻ�,����������ʾC���Բ����﷨��.
û���������еķֺź�ð����Bison������ʾÿһ������ı�����.

@example
stmt:   RETURN expr ';'
        ;
@end example

@noindent
��ȡ�ⷽ�������Ϣ,@xref{Rules, ,�﷨������﷨-Syntax of Grammar Rules}.

@node Semantic Values
@section ����ֵ-Semantic Values
@cindex ����ֵ(semantic value)
@cindex ֵ(value), ����(semantic)

�����ķ������������ѡ��Ǻ�:����,���һ�������ᵽ���ս��`integer constant',
�����ζ��@emph{�κ�}�����������Ǹ�λ���϶����﷨��Ч��.
�����ľ�ȷֵ����η������벻���:���@samp{x+4}�����﷨,��ô@samp{x+1}����@samp{x+3989}Ҳ�����﷨.

����,����������ʱ,���ľ�ȷֵ�Ƿǳ���Ҫ��,ͨ����ȷֵ�����˽�����ĺ���.
���һ��������������������е�4,1��3989�ȳ���,��������,�����������û���õ�!
���,ÿһ��Bison�﷨�ļǺżȺ���һ���������Ҳ��һ��@dfn{����ֵ(semantic value)}.
��ȡ�ⷽ��ĸ�����Ϣ,@xref{Semantics, ,�������Ե�����-Defining Language Semantics}.

�������������﷨�ж�����ս��,����@code{INTEGER},@code{IDENTIFIRE}����@code{','}.
������������Ǻſ�����Ч���ֵ�λ���Լ���ν�����ϳ������Ǻŵ���Ϣ.
�﷨����ֻ֪�����ŵ�����,������ʲô����֪��.

����ֵ�����˼Ǻŵ�����ʣ����Ϣ.������������ֵ,��ʶ��������.
(һ����@code{','}�ļǺ�ֻ��һ�����,������Ҫ����ֵ.)

����,һ������Ϊ@code{INTEGER}�ļǺŰ�������ֵ4.
��һ��Ҳ������Ϊ@code{INTEGER}�ļǺŵ�����ֵȴ��3989.
��һ���﷨�������@code{INTEGER}��������,�������Щ�ǺŶ��ǿɽ��ܵ�,��Ϊ���Ƕ���@code{INTEGER}.
��һ�������������˼Ǻ�,�����������Ǻŵ�����ֵ.

ÿһ���﷨������ķ��ս��Ҳ����������ֵ.
һ���ܵ��͵�����,�ڼ�������,һ������ʽ����һ����ֵ��Ϊ��������ֵ,
�ڳ������Ա�������.һ�����͵ı���ʽ����һ��������������������ͽṹ��Ϊ����ֵ.

@node Semantic Actions
@section ���嶯��
@cindex ���嶯��(semantic actions)
@cindex ����(actions), ����(semantic)

Ϊ�˸���ʵ��,һ�����򲻽���Ҫ����������ұ������ĸ���.
��Ӧ�ÿ���������Ļ����ϲ���һЩ���.
��Bison�﷨��,һ���﷨���������һ���������C����@dfn{����(action)}.
������ÿ��ʶ��һ�������ƥ��,��Ӧ�Ķ����ͻᱻִ��.
��ȡ�ⷽ��ĸ�����Ϣ,@xref{Actions, ,����-Actions}.

�����ʱ��,������Ŀ���ǴӲ��ֽṹ������ֵ���������ṹ������ֵ.
����,����������һ���������һ������ʽ��������������ʽ��Ӷ���.
��������ʶ����һ���ӷ���,ÿһ���ӱ���ʽ����һ����������ι���������ֵ.
�����Ķ�������Ϊ����ʶ��Ĵ����ʽ����һ�����Ƶ�����ֵ.

����,�����һ���������һ������ʽ������������ʽ��Ӷ���.

@example
expr: expr '+' expr   @{ $$ = $1 + $3; @}
        ;
@end example

@noindent
���������������δ��ӱ���ʽ������ֵ�����ӷ��ͱ���ʽ������ֵ.

@node GLR Parsers
@section ��д@acronym{GLR}������-Writing @acronym{GLR} Parsers
@cindex @acronym{GLR}����(@acronym{GLR} parsing)
@cindex ͨ��@acronym{LR}����(generalized @acronym{LR} (@acronym{GLR}) parsing)
@findex %glr-parser
@cindex ��ͻ(conflicts)
@cindex �ƽ�/��Լ ��ͻ(shift/reduce conflicts)
@cindex ��Լ/��Լ ��ͻ(reduce/reduce conflicts)

��һЩ�ķ���,Bison��׼��@acronym{LALR}(1)�����㷨,
������Ը���������Ӧ��һ��ȷ�����﷨����.
�����˵,Bison���ܲ��ܾ���(�ڵ�ǰ����Ļ�����)Ӧ��ʹ���������ܵĹ�Լ�е���һ��,
���߲��ܾ�������Ӧ��Ӧ��һ����Լ�����ȶ�ȡһЩ�����Ժ��ٽ��й�Լ.
�������ֳ�ͻ�ֱ𱻳�Ϊ@dfn{��Լ/��Լ(reduce/reduce)}��ͻ(@pxref{Reduce/Reduce, ,��Լ/��Լ-Reduce/Reduce})��
@dfn{�ƽ�/��Լ(shift/reduce)}��ͻ(@pxref{Shift/Reduce, ,�ƽ�/��Լ-Shift/Reduce}).

��Щʱ��,
Ϊ��ʹ��һ�����ѱ��޸ĳ�@acronym{LALR}(1)�ķ����ķ���ΪBison������,
Bison��Ҫʹ��ͨ�õķ����㷨.
�����������ļ��м���������������@code{%glr-parser}(@pxref{Grammar Outline, ,�﷨���-Grammar Outline}),
Bison���ͨ�õ�@acronym{LR}(@acronym{GLR})������.
��Щ������(����,��Ӧ������ǰ����������֮��)
�ڴ�����Щ������δ����ĳ�ͻ���ķ�ʱ,
������@acronym{LALR}(1)������һ���Ĵ�����ʽ.
���ǵ�����δ������ƽ�/��Լ��ͻ�͹�Լ/��Լ��ͻ��ʱ��,
@acronym{GLR}������Ȩ�˵�ͬʱ��������������,
����Ч�ؿ�¡�������Լ��Ա���׷���������ֿ�����.
ÿһ����¡�����ķ������������ٴα���¡,
��ͱ�֤�����������ʱ��,���Դ�����������ܵķ���.
�������𲽵ؽ��з���,�����еķ��������ǽ��뵽��һ������֮ǰ,
��������(��Լ)�������������.
ÿһ������¡�ķ���������ֻ���������ܵĹ���:
��������������������һ��������������ձ�����,
�������������ķ������ϲ�,��Ϊ���ǰ������Լ����һ����ͬ�ķ��ż�.

���ж�������������ʱ��,Bisonֻ��¼���ǵ����嶯��������ִ������.
��һ����������ʧ��ʱ��,��Ӧ�����嶯����¼Ҳ��ʧ������Զ���ᱻִ��.
��һ����Լʹ�������������ȼ۶��ϲ���ʱ��,
Bison���¼���������������嶯����.
ÿ����������������ϲ���Ϊһ�������ķ�������ʱ��,
Bisonִ������δ��ɵĶ���.��Щ�����ȿ��������﷨��������ȼ���ִ��Ҳ���ܾ���Bisonִ��.
��ִ���궯��֮��,Bison����ָ�����û�������ֵ����������һ�������ĺϲ�ֵ.


@menu
* �򵥵�GLR������(Simple GLR Parsers):Simple GLR Parsers.          ʹ��@acronym{GLR}�����������������ķ�
* �ɺϲ���GLR������(Merging GLR Parsers):Merging GLR Parses.          ʹ��@acronym{GLR}�������������
* �Ա�������Ҫ��(Compiler Requirements):Compiler Requirements.       @acronym{GLR}��������Ҫһ���ִ���C������
@end menu

@node Simple GLR Parsers
@subsection ʹ��@acronym{GLR}�����������������ķ�
@cindex @acronym{GLR}����(@acronym{GLR} parsing), �������ķ�(unambiguous grammars)
@cindex ͨ��@acronym{LR}(@acronym{GLR})����(generalized @acronym{LR} (@acronym{GLR}) parsing), �������ķ�(unambiguous grammars)
@findex %glr-parser
@findex %expect-rr
@cindex ��ͻ(conflicts)
@cindex ��Լ/��Լ��ͻ(reduce/reduce conflicts)
@cindex �ƽ�/��Լ��ͻ(shift/reduce conflicts)

����򵥵������,�����ʹ��@acronym{GLR}�㷨������Щ�����嵫����@acronym{LALR}(1)�ķ����ķ�.
���͵�,��Щ�ķ���Ҫ��ֹһ���ĳ�ǰɨ��Ǻ�,
����(�ڼ����������)����@acronym{LALR}(1)�㷨����̫�����Ϣ
��������@acronym{LALR}(1)���ķ�(����ȴ����@acronym{LR}(1),����@ref{Mystery Conflicts, ,��ͻ-Mystery Conflicts}).

����һ��������Pascal����ö�ٺ��ӽ����������е�����,.
������һЩ����:

@example
type subrange = lo .. hi;
type enum = (a, b, c);
@end example

@noindent
��������Ա�׼ֻ�������ֺͳ�����ʶ����Ϊ�ӽ�ķ�Χ(@samp{lo}��@samp{hi}).
������չ��Pascal(@acronym{ISO}/@acronym{IEC}10206)�Լ�����������Pascal��ʵ�ֻ����������ı���ʽ.
�⵼��������һ�������������ŵ�����.

@example
type subrange = (a) .. b;
@end example

@noindent
���������������һ��ֵ��ö�����͵�����.

@example
type enum = (a);
@end example

@noindent
(���������Щ��������Ϊ�����,���������﷨��Ч��.
��ʵ�ʵĳ����п��ܻ���ָ����ӵ�����)

���������ӿ�������ͬ(ע:ָ�﷨��)ֱ��@samp{..}�Ǻŵĳ���.
����ֻ����һ����ǰɨ��Ǻŵ���ͨ@acronym{LALR}(1)����,
��@samp{a}��������ʱ,�������򲢲���������ʽ��(ע:ָö�ٻ����ӽ�)��һ������ȷ��.
��Ϊ�ں�һ��������,@samp{a}�����Ϊһ���µı�ʶ������ʾö��;
����ǰһ�������б���ʹ��@samp{a}�����ĺ�����������������һ���������ߺ�������,
�������ǵ�Ȼϣ�����������ԶԴ�������ȷ�ľ���.

��ɽ�@samp{(a)}������``��������Ϊ˵���ı�ʶ��''�Ա��Ժ���з���.
��������Ƕ���ڱ���ʽ�ĵݹ�����е�ʱ��,
���ַ�ʽ��Ҫ�����嶯���ʹ󲿷��﷨������Ӧ�ĵ���.

����ܻ��뵽ʹ�ôʷ�������ͨ�������Ѷ����δ���ر�ʶ����������������ʽ.
���������Щ�����ھֲ�����,
��@samp{a}���ⲿ�����ʱ��,��������ʽ���ǿ��ܵ�--
�ȿ����Ǿֲ��ض����@samp{a}.Ҳ������ʹ���ⲿ�����@samp{a}��ֵ.
�������ַ���������.

������������һ���򵥵İ취,�Ǿ���ʹ��@acronym{GLR}�㷨.
��@acronym{GLR}����������ؼ������ʱ��,
����ͬʱ����������֧���з���.
���е�һ����֧����Ҫ�����������.
�����һ��@samp{..}�Ǻ�����һ��@samp{;}֮ǰ�Ļ�;
����ö�����͵Ĺ����ܽ���@samp{..},������Ӧ��ʧ��;
����,�ӽ����͹���Ӧ��ʧ��,��Ϊ��Ҫ��һ��@samp{..}�Ǻ�.
����,һ����֧������ʧ�ܶ���һ����֧�����ؽ���,
����ִ�����е��ڲ���ڼ䱻�Ƴ�ִ�е��м䶯��.

������벻�����﷨,����������֧�ķ�������ʧ��
�����糣�ر���һ���﷨����.

�������Ĺ����ƺ�����``�²�''��ȷ���﷨��֧,���仰˵,
��ʹ���˱�@acronym{LALR}(1)�㷨����ʹ�õĸ���ĳ�ǰɨ��Ǻ�.
@acronym{LALR}(2)�����������������,
������Щ������@acronym{LALR}(@math{k})������,
��ʹ������@math{k}���������ش���.

һ�����,һ��@acronym{GLR}�������������»Ứ�Ѷ��η��������η���ʱ�临�Ӷ�,
��ǰ��Bison������Ϊ��ĳЩ�ķ�������ָ����ʱ��.
��ʵ��Ӧ����,��Щ�������ᷢ��,
���Ҷ��������ķ���˵,֤�������ܷ���Ҳ�ǿ��ܵ�.
��ǰ���۵�����������������ֻ��һ����ͻ,
���Һ��г�ͻ��������������Ƕ��ʹ��.
����������ʱ�̵ķ�֧�����������ڳ���2����,
��ʱ�����ʱ����Ȼ�����Ե�.

����һ��ͬ�����������Ӧ������.
����Pascal�����������򻯶���.
������벻�����﷨,������֧����ʧ�ܲ����糣�ر���һ���﷨����.

@example
%token TYPE DOTDOT ID

@group
%left '+' '-'
%left '*' '/'
@end group

%%

@group
type_decl : TYPE ID '=' type ';'
     ;
@end group

@group
type : '(' id_list ')'
     | expr DOTDOT expr
     ;
@end group

@group
id_list : ID
     | id_list ',' ID
     ;
@end group

@group
expr : '(' expr ')'
     | expr '+' expr
     | expr '-' expr
     | expr '*' expr
     | expr '/' expr
     | ID
     ;
@end group
@end example

��ʹ��ƽ����@acronym{LALR}(1)�ķ���ʱ��,Bison�ᱨ��һ����Լ/��Լ��ͻ.
�ڳ�ͻ��ʱ��,�������ڻ��ڶ�ѡ����ѡȡһ��--�����ѡ���Ǹ���������.
�����������ȷ���벻�ܱ�ʶ��.

@example
type t = (a) .. b;
@end example

��Bison�����ļ���,
��������������(�ڵ�һ��@samp{%%}֮ǰ)���������Խ����������һ��@acronym{GLR}������,
����Bison���ᱨ��һ����Լ/��Լ��ͻ.

@example
%glr-parser
%expect-rr 1
@end example

@noindent
������Ҫ���﷨���������޸�.
��������ͨ������������﷨��,������ʶ������Ч������.
�û�ʵ���ϲ����ܲ���������Ĳ��.

���������ʹ��@acronym{GLR}������û�л���������.
��ʹ�������򵥵�����,��������Ǳ�ڵ�����ֵ������ע��.
��һ,������Ӧ�÷���Bison�ĳ�ͻ������ȷ��@acronym{GLR}����ܷ�����������Ҫ��ʱ��.
һ��@acronym{GLR}�������Ĳ�ֻ᲻����ز�����@acronym{LALR}�������ڳ�ͻ�о�̬�Ĵ���ѡ��
���Ӳ����Ե�����.
�ڶ�,Ҫ��ϸ������ʷ��������Ļ���(@pxref{Semantic Tokens, ,����Ǻ�-Sematic Tokens}).
�����ڲ���ڼ�ķ��������ļǺ�ʱ���������κζ���,
�ʷ�������������ͨ���������������Ϣ.
һЩ��ʷ��������Ļ�����ʹ��@acronym{GLR}�������Ӵʷ����������﷨�������ĸ��Ӷ�ʱ���Ժ���.
����������������ʱ����ȷ��.

�����ǵ�������,��Ϊ��û���µķ��������������м䱻����.
�ʷ����������ڼǺŵ�ǰ�ڷ��ű��ĺ��ⱻ�����ǰ�ȫ��.
@c bad translation
��ʹ�ڷ���ö�ٳ���ʱ���������ǿ��ܵ�,
@c up
�������ǲ�������ͬ��ö������������ʹ��,
������ʵ���ϲ�û��ʲô��ͬ.


@node Merging GLR Parses
@subsection ʹ��@acronym{GLR}�������-Using @acronym{GLR} to Resolve Ambiguities
@cindex @acronym{GLR} parsing, ambiguous grammars
@cindex generalized @acronym{LR} (@acronym{GLR}) parsing, ambiguous grammars
@findex %dprec
@findex %merge
@cindex conflicts
@cindex reduce/reduce conflicts

�����ǿ�����C++�﷨���򻯶���������.

@example
%@{
  #include <stdio.h>
  #define YYSTYPE char const *
  int yylex (void);
  void yyerror (char const *);
%@}

%token TYPENAME ID

%right '='
%left '+'

%glr-parser

%%

prog :
     | prog stmt   @{ printf ("\n"); @}
     ;

stmt : expr ';'  %dprec 1
     | decl      %dprec 2
     ;

expr : ID               @{ printf ("%s ", $$); @}
     | TYPENAME '(' expr ')'
                        @{ printf ("%s <cast> ", $1); @}
     | expr '+' expr    @{ printf ("+ "); @}
     | expr '=' expr    @{ printf ("= "); @}
     ;

decl : TYPENAME declarator ';'
                        @{ printf ("%s <declare> ", $1); @}
     | TYPENAME declarator '=' expr ';'
                        @{ printf ("%s <init-declare> ", $1); @}
     ;

declarator : ID         @{ printf ("\"%s\" ", $1); @}
     | '(' declarator ')'
     ;
@end example

@noindent
�������ģ�����������C++�﷨---ĳЩ����������е�����.����,

@example
T (x) = y+z;
@end example

@noindent
�ȿ��Ա�����Ϊһ��@code{expr}Ҳ�ɱ�����Ϊһ��@code{stmt}
(�ٶ�@samp{T}��ʶ��Ϊһ��@code{TYPENAME}����@samp{x}��ʶ��Ϊ@code{ID}).
Biosn��⵽������ڹ���@code{expr : ID}�͹���@code{delarator : ID}֮��Ĺ�Լ/��Լ��ͻ.
����������@code{x}��ʱ�򻹲��ܽ����ͻ.
��������һ��@acronym{GLR}������,��������������ֳ�����������,
ÿһ�����ڽ����Լ/��Լ��ͻ�е�һ��.
����һ�ڵ����Ӳ�ͬ(@pxref{Simple GLR Parsers, ,�򵥵�GLR������}),�����������е���һ������``����,''
��Ϊ����﷨�������������.
���е�һ���������չ�Լ��@code{stmt : expr ';'}����һ����Լ��@code{stmt : decl},
����֮��,��������������ͬһ��״̬: ���Ƕ��Ѿ�����@samp{prog stmt}��������ͬ��δ����ʣ������.
����˵��Щ�������Ѿ�@dfn{�ϲ�(merged)}.

�����ʱ��,@acronym{GLR}��������Ҫһ��������������������ķ���������ѡ���˵��.
�������������,����@code{%dprec}����˵����Bison����@code{decl}�Ľ��������ȼ�.
��ͱ���@code{x}��һ��������(declarator).
��˷��������ӡ��:

@example
"x" y z + T <init-declare>
@end example

@code{%deprc}�������ڶ���һ�������Ҵ�������������.
���������������һ����ͬ�������ַ���:

@example
T (x) + y;
@end example

@noindent
������һ��չʾ��һ��(@pxref{Simple GLR Parsers, ,�򵥵�GLR������-Simple GLR Parsers}),
��������һ��ʹ��@acronym{GLR}����������ṹ������.
�����ﲢû������(��������ܱ�������һ������).
������Bison����������@code{x}��ʱ��,
��û���㹻����Ϣ�����Լ/��Լ��ͻ(���ǲ��ܾ���@code{x}��һ��@code{expr}����һ��@code{declarator}).
�����������,û�����ȼ��ɹ�ʹ��.
�������ٴα���ֳ�����,һ���ٶ�@code{x}��һ��@code{expr}
����һ���ٶ�@code{x}��һ��@code{declarator}.
�����������еĵڶ���������@code{+}��ʱ������,���ҷ�������ӡ��


@example
x T <cast> y +
@end example

��������鿴���еĿ����Զ����ǽ������.
�����ϲ��������ܵķ����������嶯��������ѡ�����е�һ��.
Ϊ�˴ﵽ���Ŀ��,����Ҫ�����������ظı�@code{stmt}������:

@example
stmt : expr ';'  %merge <stmtMerge>
     | decl      %merge <stmtMerge>
     ;
@end example

@noindent
���Ҷ���@code{stmtMerge}��������:

@example
static YYSTYPE
stmtMerge (YYSTYPE x0, YYSTYPE x1)
@{
  printf ("<OR> ");
  return "";
@}
@end example

@noindent
�������ļ��Ŀ�ͷҪ����һ��ǰ��������C������:

@example
%@{
  #define YYSTYPE char const *
  static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);
%@}
@end example

@noindent
ʹ����Щ�����Ժ�,�����ĵķ���������һ�����Ӽȷ�����һ��@code{expr}�ַ�����һ��@code{decl},
���Ҵ�ӡ

@example
"x" y z + T <init-declare> x T <cast> y z + = <OR>
@end example

BisonҪ�����вμ��κ��ض��ϲ��Ĳ�Ʒ(productions)ӵ����ͬ��@samp{%merge}���.
����,���岻�ܱ�������ҷ����������κε���Υ���涨�ĺϲ�ʱ�򱨸�һ������.

@node Compiler Requirements
@subsection ����@acronym{GLR}������ʱ��Ҫ���ǵ�����-Considerations when Compiling @acronym{GLR} Parsers
@cindex @code{inline}
@cindex @acronym{GLR}��������@code{inline}(@acronym{GLR} parsers and @code{inline})

@acronym{GLR}��������Ҫ֧��C89����±�׼�ı�����.
�����,Bisonʹ�ùؼ���@code{inline},����ؼ��ֲ���C89��׼��ȴ��C99��׼,
����������C99֮ǰ������֧�ֵ���չ.
ʹ������Ϊ�˷��������û����Դ�����ֲ������.
����,���ʹ��Autoconf��Autoconf��@code{AC_C_INLINE},һ��������

@example
%@{
  #include <config.h>
%@}
@end example

@noindent
���㹻����,�������ǽ���ʹ��

@example
%@{
  #if __STDC_VERSION__ < 199901 && ! defined __GNUC__ && ! defined inline
   #define inline
  #endif
%@}
@end example

@node Locations Overview
@section λ��-Locations
@cindex λ��(location)
@cindex ԭ��λ��(textual location)
@cindex λ��(location), ԭ�ĵ�(textual)

����Ӧ�ó���,��������ͱ�����,��Ҫ����һЩ������Ϣ���߳�������Ϣ.
Ϊ�˴ﵽ���Ŀ��,���Ǳ���׷��ÿ���﷨�ṹ��@dfn{ԭ��λ��(textual location)}��@dfn{λ��(location)}.
Bison�ṩ��׷����Щλ�õĻ���.

ÿһ���Ǻ���һ������ֵ.���Ƶ�,ÿ���Ǻ�Ҳ��һ��λ��,
�������мǺź�����˵,���ǵ�λ�õ���������ͬ��.
����,����ķ�����Ҳ����Ĭ�ϵĴ洢λ�õ����ݽṹ
(��ȡ������Ϣ,@pxref{Locations, ,λ��-Locations}).

������ֵһ��,λ�ÿ����ڶ�����ʹ���ض���һ�׽ṹ������.
���������������,�����ĵ�λ����@code{@@$},���ӱ���ʽ��λ����@code{@@1}��@code{@@3}.

��һ������ƥ��,һ��Ĭ�ϵĶ������ڼ�����������ֵ(@pxref{Actions, ,����-Actions}).
���Ƶ�,����һ��Ĭ�ϵĶ������ڼ���λ��.
Ȼ��,���Ĭ�϶������ڶ��ڴ��������Ѿ��㹻��,
������û�б�ҪΪÿ����������@code{@@$}Ӧ��������γɵ�.
��Ϊһ���������齨��һ���µ�λ�õ�ʱ��,
����ķ�������Ĭ����Ϊ��ȡ��һ�����ŵĿ�ͷ�����һ�����ŵ�ĩβ.

@node Bison Parser
@section Bison�����:�������ļ�-Bison Output: the Parser File
@cindex Bison������(Bison parser)
@cindex Bison����(Bison utility)
@cindex �ʷ�������(lexical analyzer), Ŀ��(purpose)
@cindex ������(parser)

��������Bison��ʱ��,����Ҫ��Bisonһ���﷨�ļ���Ϊ������.
Bison�������һ����������﷨�ļ����������Ե�CԴ�����ļ�.
����ļ�����@dfn{Bison������(Bison parse)}.
����Ҫ��סBison���ߺ�Bison���������������Բ�ͬ�ĳ���:
Bison������һ����Bison������Ϊ����ĳ���.
���Bison������Ӧ��������һ����.

Bison�������Ĺ����������﷨������ϼǺ�---����,����ʶ���Ͳ����������ɱ���ʽ.
����ϵĹ���������Ҫִ����Ӧ���﷨�涨�Ķ���.

�Ǻ�����Դ�ڳ�Ϊ@dfn{�ʷ�������(lexical analyzer)}�ĳ���.
�������ĳ����ʽ�ṩ�ʷ�������(����C��д).
Bison������ÿ����Ҫһ���µļǺŵ�ʱ��ͻ���ôʷ�������.
Bison����������֮���Ǻ�``��''��ʲô����(��ʹ���ǵ�����ֵ���ܷ�ӳ���).
���͵Ĵʷ��������������ַ��������Ǻ�,����Bison�����������.
��ȡ����ϸ��,@xref{Lexical, ,�ʷ���������@code{yylex}-The Lexical Analyzer Function @code{yylex}}.

Bison�������ļ��Ƕ�������Ϊ@code{yyparse}����ʵ�����Ǹ��﷨�ĺ�����C����.
������������ܳ�Ϊһ����ɵ�C����:������ṩ�����һЩ����.
����֮һ�Ǵʷ�������.�����һ����һ���������������ʱ���õĴ��󱨸溯��.
����,һ��������C�����������Ϊ@code{main}�ĺ�����ͷ;
������ṩ�������.���Ұ���������@code{yyparse}.
�����������Զ����������.
@xref{Interface, ,������C���Խӿ�-Parser C-Language Interface}.

�������д�Ķ����еļǺ��������ƺͷ�������
,����Bison�������ļ��Լ�����ķ��Ŷ���@samp{yy}����@samp{YY}��ͷ.
��Щ���Ű����˽ӿں�������ʷ���������@code{yylex},���󱨸溯��@code{yyerror}
�ͷ���������@code{yyparse}.
��Щ����Ҳ�����������ڲ�Ŀ�ĵı�ʶ��.
������Ҫ��Bison�﷨�ļ��б���ʹ�ó��˱��ֲᶨ����������@samp{yy}����@samp{YY}��ͷ��C��ʶ��.

��һЩ�����,Bison�������ļ�����ϵͳͷ�ļ�.
�����������,��Ĵ���ע�ⱻ��Щ�ļ������ı�ʶ��.
����Щ��@acronym{GNU}ϵͳ,@code{<alloca.h>},@code{<stddef.h>}�Լ�@code{<stdlib.h>}
�������������������ڴ���������������.
����㶨��@code{YYDEBUG}Ϊ����ֵ,������ϵͳͷ�ļ�Ҳ���ܱ���������.
(@pxref{Tracing, ,������ķ�����-Tracing Your Parser})

@node Stages
@section ʹ��Bison������-Stages in Using Bison
@cindex ʹ��Bison������(stages in using Bison)
@cindex ʹ��Bison(using Bison)

ʵ��ʹ��Bison������Ե�����,���﷨��������дһ�����������߽�����,����������:

@enumerate
@item
��Bison��ʶ��ĸ�ʽ��ʽ�������﷨.(@pxref{Grammar File, ,Bison�﷨�ļ�})
��ÿһ���﷨����,�������������ʶ��ʱ��Ӧ��ִ�ж���.
������C�����������.

@item
��дһ���ʷ��������������벢���ǺŴ��ݸ��﷨������.
�ʷ��������ȿ����ֹ���д��C����(@pxref{Lexical, ,�ʷ���������@code{yylex}}),
Ҳ������lex����,����lex��ʹ�ò�δ������ֲ�������.

@item
��дһ������Bison�����ķ������Ŀ��ƺ���.

@item
��д���󱨸溯��.
@end enumerate

����ЩԴ����ת���ɿ�ִ�г���,����Ҫ�����²������.

@enumerate
@item
���﷨����Bison����������.

@item
ͬ����Դ����һ������Bison����Ĵ���.

@item
����Ŀ���ļ��Բ������յĲ�Ʒ.
@end enumerate

@node Grammar Layout
@section Bison�﷨�ļ������岼��-The Overall Layout of a Bison Grammar
@cindex �﷨�ļ�(grammar file)
@cindex �ļ���ʽ(file format)
@cindex �﷨�ļ��ĸ�ʽ(format of grammar file)
@cindex Bison�﷨�ļ��Ĳ���(layout of Bison grammar)

Bison���ߵ������ļ����Ը�@dfn{Bison�﷨�ļ�(Bison grammar file)}.
ͨ����Bison�﷨�ļ���ʽ����:

@example
%@{
@var{Prologue}
%@}

@var{Bison declarations}

%%
@var{Grammar rules}
%%
@var{Epilogue}
@end example

@noindent
@samp{%%},@samp{%@{} ��@samp{%@}}��Bison��ÿ��Bison�﷨�ļ������ڷָ����ֵı�����.

@var{prologue}�����������ڶ�����ʹ�����ͺͱ���.
�����ʹ��Ԥ�����������������������,
����ʹ��@code{#include}��������Щ�����ͷ�ļ�.
����Ҫ��������������Ҫ���﷨����Ķ�����ʹ�õ�ȫ�ֱ�ʶ��һ��
�����ʷ�������@code{yylex}�ʹ����ӡ����@code{yyerror}.

@var{Bison declarations}�������ս���ͷ��ս���Լ������������ȼ��͸��ַ�������ֵ�ĸ�������.

@var{Grammar rules}��������δ�ÿһ�����ս���Ĳ��ֹ�����������﷨����.

@var{Epilogue}���԰����κ�����ʹ�õĴ���.
��@var{Prologue}�������ĺ�����������������.
�ڼ򵥵ĳ�����,ʣ������г�����Է�������.

@node Examples
@chapter ʵ��-Examples
@cindex ��ʵ��(simple examples)
@cindex ʵ��(examples), ��(simple)

���ڿ�ʼ����չʾ����������ʹ��Bison��д��ʾ������:
һ���沨���Ǻż�����,һ����������(��׺)��������һ���๦�ܼ�����.
��Щ������BSD Unix 4.3�ϲ�������;����ÿһ����Ȼ��������,
��ȷ����ʵ�õĻ������������.

��Щ������Ȼ��,������Bison�﷨��д�����ĳ���������Եĵ���������ͬ.
@ifinfo
����Խ���Щ������info�ļ�����ΪԴ�����ļ�,�����Ա�����������
@end ifinfo

@menu
* RPN������(RPN Calc):RPN Calc.          �沨���Ǻż�����,���ǵĵ�һ������,�������в��������ȼ�
* ��׺������(Infix Calc):Infix Calc.        ��׺�������ż�����,�򵥵ؽ��ܲ��������ȼ�.
* �򵥵Ĵ���ָ�(Simple Error Rcovery):Simple Error Recovery.  �ڳ����﷨������������
* λ��׷�ټ�����(Location Tracking Calc):Location Tracking Calc. չʾ@@@var{n}��@@$���÷�
* �๦�ܼ�����(Multi-function Calc):Multi-function Calc.  ���д洢�ʹ������ܵļ�����.��ʹ���˶���������������ʾ����ֵ.
* ��ϰ(Exercises):Exercises.         һЩ�Ľ��๦�ܼ������ķ���
@end menu

@node RPN Calc
@section �沨���Ǻż�����-Reverse Polish Notation Calculator
@cindex �沨���Ǻ�(reverse polish notation)
@cindex �����Ǻż�����(polish notation calculator)
@cindex @code{rpcalc}
@cindex ������(calculator), ��(simple)

���ǵĵ�һ��������˫����@dfn{�沨���Ǻ�(reverse polish notation)}������(һ��ʹ�ú�׺�������ļ�����).
���������һ���ܺõ����,��Ϊû�в��������ȼ�������.
�ڶ������ӻ�˵����δ�����������ȼ�.

�����������Դ�����ļ���@file{rpcalc.y}.
@samp{.y}��Bison���õ������ļ�����չ��.

@menu
* ����(Decls): Rpcalc Decls.  rpclac��Prologue(����)����.
* ����(Rules): Rpcalc Rules.  ��ע�͵�rpcalc�﷨����
* �ʷ�������(Lexer): Rpcalc Lexer.  �ʷ�������
* ������(Main): Rpcalc Main.    ���ƺ���
* ����(Error): Rpcalc Error.  ���󱨸�Ĺ���
* ����(Gen): Rpcalc Gen.      ʹ��Bison���ɷ�����
* ����(Comp): Rpcalc Compile. ʹ��C����������õ����ս��
@end menu

@node Rpcalc Decls
@subsection @code{rpclac}����������-Declarations for @code{rpcalc}

������沨���Ǻż�������C��Bison��������.
��C����һ��,ע�Ͳ�����@samp{/*@dots{}*/}��.

@example
/* Reverse polish notation calculator.  */
/* �沨���Ǻż����� */

%@{
  #define YYSTYPE double
  #include <math.h>
  int yylex (void);
  void yyerror (char const *);
%@}

%token NUM

%% /* Grammar rules and actions follow.  */
@end example

��������(@pxref{Prologue, ,@var{Prologue}����-The prologue})����������Ԥ����ָ�������ǰ������.

@code{#define}ָ�����@code{YYSTYPE}��,
��ָ���˼Ǻź���(@pxref{Value Type, ,����ֵ����������-Data Types of Semantic Values})����ֵ��C��������.
Bison��������ʹ���κ�@code{YYSTYPE}�������������;
�����û�ж�����,@code{int}����Ĭ�ϵ�����.
��Ϊ����ָ����@code{double},����ÿ���Ǻźͱ���ʽ�Ѿ�������һ��������ֵ.

@code{#include}���������ݺ���@code{pow}.

����C����Ҫ����������ʹ��֮ǰ����,
����ǰ������@code{yylex}��@code{yyerror}�Ǳ����.
��Щ��������@var{epilogue}���ֶ���,���Ƿ��������������,
�������Ǳ�����@var{prologue}��������.

�ڶ�����-@var{Bison declarations},�ṩ���йؼǺ����͵���Ϣ(@pxref{Bison Declarations, ,@var{Bison Declarations}����-The Bison Declarations Section}).
ÿһ����ֻһ���ַ���ɵ��ս����������������.(ͨ��û�б�Ҫ������һ�ַ�.)
�����������,���е��������������ǵ�һ�ַ���,
�����������������Ҫ�������ս����@code{NUM}---���ֳ����ļǺ�����.

@node Rpcalc Rules
@subsection @code{rpcalc}���﷨����-Grammar Rules for @code{rpcalc}

������沨���Ǻż��������﷨����:

@example
input:    /* empty */
        | input line
;

line:     '\n'
        | exp '\n'      @{ printf ("\t%.10g\n", $1); @}
;

exp:      NUM           @{ $$ = $1;           @}
        | exp exp '+'   @{ $$ = $1 + $2;      @}
        | exp exp '-'   @{ $$ = $1 - $2;      @}
        | exp exp '*'   @{ $$ = $1 * $2;      @}
        | exp exp '/'   @{ $$ = $1 / $2;      @}
         /* Exponentiation */
        | exp exp '^'   @{ $$ = pow ($1, $2); @}
         /* Unary minus    */
        | exp 'n'       @{ $$ = -$1;          @}
;
%%
@end example

�����ﶨ���rpcalc``����''������:����ʽ(������@code{exp}),
������(@code{line}),����������ű�(@code{input)}.
��Щ���ս��ÿ�����ж����ѡ��Ĺ���.
��Щ������@samp{|}���Ӷ���.
���ǿ��԰�@samp{|}����``����''.
�������Ĳ��ֽ����˹���ĺ���.

�﷨�������ɵ����鱻ʶ��ʱִ�еĶ�������.
�������ڴ�������C�������.
@pxref{Actions, ,����-Actions}.

�������C������ָ����Щ����,
����BisonҲ�ṩ���ڹ���֮�䴫������ֵ�ķ���.
��ÿ��������,α����@code{$$}�����Ž�Ҫ�������������ֵ.
��ֵ��@code{$$}�Ǵ���������Ĺ���.
�������ɲ��ֵ�����ֵ��@code{$1},@code{$2}�ȵ�ָ��.

@menu
* Rpcalc Input::
* Rpcalc Line::
* Rpcalc Expr::
@end menu

@node Rpcalc Input
@subsubsection ����@code{input}-Explanation of @code{input}

����@code{input}�Ķ���:

@example
input:    /* empty */
        | input line
;
@end example

���������Ա�����Ϊ:``һ�����������뼺������һ�����ַ���,
Ҳ������һ��������������һ��������''.
����Ӧ��ע�⵽``��������''���������Լ���������.
����@code{input}���ǳ����ڷ������е������,
���ǳ����ֶ���Ϊ@dfn{��ݹ�(left recursive)}.
(@xref{Recursion, ,�ݹ����-Recursive Rule}.)

��һ����ѡ��Ĺ���Ϊ����������ð�ź͵�һ��@samp{|}֮��û���κη���;
����ζ��@code{input}����ƥ��һ�����ַ���������(û�з���).
����������д��������Ϊ����������������,���Ҷ�����@kbd{Ctrl-d}�ǺϷ���.
�ѿչ�������ʼ������ע��@samp{/* empty */}��ʹ�ù���.

�ڶ�����ѡ�Ĺ���(@code{input line})���������з�ƽ��������.
���ĺ�����``�ڶ�ȡ���������line��,������ܵĻ���ȡ�����line.''
���ݹ�ʹ������������ѭ��.
���ڵ�һ����ѡ�Ĺ����������ƥ��,ѭ�����ܱ�ִ����λ���.

����������@code{yyparse}������������ֱ������һ���﷨�������
�ʷ�����������û�и��������Ǻ�Ϊֹ;
���ǻᰲ�ź��������������ʱ����.

@node Rpcalc Line
@subsubsection ����@code{line}-Explanation of @code{line}

�������ǿ���@code{line}�Ķ���:

@example
line:     '\n'
        | exp '\n'  @{ printf ("\t%.10g\n", $1); @}
;
@end example

��һ��ѡ����һ�����з���;
����ζ��rpcalc����һ���հ���(���Һ�����,��Ϊû����صĶ���).
�ڶ���ѡ����һ������ʽ�������һ�����з�.
���ѡ��ʹ��rpcalc���ʵ��.
@code{$1}��ֵ��@code{exp}�������ֵ,
������Ϊ@code{exp}�����ѡ���еĵ�һ������.
���ֵ�����û���Ҫ�ļ�����.
��صĶ�����ӡ��������ֵ.

���������ͬѰ��,��Ϊ����û����@code{$$}��ֵ.
�������Ľ��������@code{line}�����������ֵ��δ����ʼ��(����ֵ�ǲ���Ԥ�ڵ�).
����Ǹ�ֵ��ʹ�õĻ�,����Ϊһ��bug,�������ǲ�δʹ����.
rpcalcһ���Ѿ���ӡ���û������е�ֵ,�Ͳ�����Ҫ�Ǹ�ֵ��.

@node Rpcalc Expr
@subsubsection ����@code{expr}-Explanation of @code{expr}

@code{exp}���кܶ����,ÿһ������һ�ֱ���ʽ.
��һ����������򵥵ı���ʽ:���������ֵı���ʽ.
�ڶ�����������������������ʽ�����һ���ٷ����ŵļӷ�����ʽ.
���������������ȵ�.

@example
exp:      NUM
        | exp exp '+'     @{ $$ = $1 + $2;    @}
        | exp exp '-'     @{ $$ = $1 - $2;    @}
        @dots{}
        ;
@end example

�����Ѿ�ʹ��@samp{|}��@code{exp}�Ĺ�����������.
��������Ҳ���Խ����Ƿֿ���д:

@example
exp:      NUM ;
exp:      exp exp '+'     @{ $$ = $1 + $2;    @} ;
exp:      exp exp '-'     @{ $$ = $1 - $2;    @} ;
        @dots{}
@end example

�󲿷ֹ����д��䲿��ֵ���������ʽֵ�Ķ���.
����,�ڼӷ��Ĺ�����,@code{$1}ָ���ǵ�һ������@code{exp},
��@code{$2}ָ���ǵڶ�������.
����������@code{'+'}��û�������������ֵ.
���������������ֵ�Ļ�,�������@code{$3}������.
��@code{yyparse}ʹ���������ʶ����һ���ӷ��ͱ���ʽ,
�����Ա���ʽֵ����Ӷ��õ������������ǵ�ֵ.
@xref{Actions, ,����-Actions}.

�㲻��Ϊÿһ������ָ������.
��һ������û�ж���ʱ,Bison��Ĭ�ϵؽ�@code{$1}��ֵ���Ƹ�@code{$$}.
������ڵ�һ����(ʹ��@code{NUM}�Ĺ���)ʶ��ʱ����������.

������չʾ�����Ƽ��Ĺ��ø�ʽ,
����Bison��û��Ҫ��һ��Ҫ��ô��.
��������ӻ��߸�����������Ҫ�������Ŀհ�.
����,���:

@example
exp   : NUM | exp exp '+' @{$$ = $1 + $2; @} | @dots{} ;
@end example

@noindent
�������������ͬ

@example
exp:      NUM
        | exp exp '+'    @{ $$ = $1 + $2; @}
        | @dots{}
;
@end example

@noindent
Ȼ��,��һ��д�����Ը��ɶ�.

@node Rpcalc Lexer
@subsection @code{rpcalc}�Ĵʷ�������-The @code{rpcalc} Lexical Analyzer
@cindex ��дһ���ʷ�������(writing a lexical analyzer)
@cindex �ʷ�������(lexical analyzer), ��д(writing)

�ʷ��������Ĺ����ǵͼ���ķ���:
���ַ������ַ�����ת���ɼǺ�.
Bison�����������ôʷ�����������ȡ���ļǺ�.
@xref{Lexical, ,�ʷ���������@code{yylex}-The Lexical Analyzer Function @code{yylex}}.

��ʹ��򵥵Ĵʷ�������Ҳ��@acronym{RPN}�������������.
����ʷ������������˿հ׺��Ʊ���,
Ȼ�����ֶ�ȡΪ@code{double}������@code{NUM}�Ǻŷ�������.
�κβ������ֵ��ַ�����һ���ָ��Ǻ�.
ע�⵽һ�������ַ��ļǺ�������ַ�����.


�ʷ��������ķ���ֵ��һ�������Ǻ����͵�������.
��ͬ������(��Biosn������ʹ��,��������Ǻ�����)
Ҳ��һ��������������������C����ʽ.
�������ַ�ʽ����.
����Ǻ�������һ���ַ�,��ô��������������Ǹ��ַ�;
������ڴʷ���������ʹ����ͬ�ַ������Ǹ�������.
����Ǻ�������һ����ʶ��,
�Ǹ���ʶ����һ����Bison����Ϊһ��ǡ�������ֵĺ�,
��������������,@code{NUM}��һ����@code{yylex}ʹ�õĺ�.

�Ǻŵ�����ֵ(����еĻ�)���洢��ȫ�ֱ���@code{yylval}��.
Bison������������Ҫ����ֵ�ʵ���ʱ���ҵ���.
(@code{yylval}��C��������@code{YYSTYPE},�����﷨�Ŀ�ʼ������;
@pxref{Rpcalc Decls, ,@code{rpcalc}����������-Declarations for @code{rpcals}}.

����������0�����������ʱ�򱻷���.
(Bison���κβ���ȷ��ֵʶ��Ϊ�������)

����Ǵʷ��������Ĵ���:

@example
@group
/* The lexical analyzer returns a double floating point
   number on the stack and the token NUM, or the numeric code
   of the character read if not a number.  It skips all blanks
   and tabs, and returns 0 for end-of-input.  */
/* �ʷ���������ջ�Ϸ���һ��˫���ȸ�����(ע:ָyylval)���ҷ��ؼǺ�NUM,
   ���߷��ز������ֵ��ַ���������.���������еĿհ׺��Ʊ���,
   ���ҷ���0��Ϊ����Ľ���. */
#include <ctype.h>
@end group

@group
int
yylex (void)
@{
  int c;

  /* Skip white space.  */
  /* �����հ�. */
  while ((c = getchar ()) == ' ' || c == '\t')
    ;
@end group
@group
  /* Process numbers.  */
  /* �������� */
  if (c == '.' || isdigit (c))
    @{
      ungetc (c, stdin);
      scanf ("%lf", &yylval);
      return NUM;
    @}
@end group
@group
  /* Return end-of-input.  */
  /* ����������� */
  if (c == EOF)
    return 0;
  /* Return a single char.  */
  /* ����һ����һ�ַ� */
  return c;
@}
@end group
@end example

@node Rpcalc Main
@subsection ���ƺ���-The Controlling Function
@cindex ���ƺ���(controlling function)
@cindex �����ӵ�main����(main function in simple example)

Ϊ�˱�֤������ӵľ���,���ƺ���Ҳ��������С����
������Ҫ�����@code{yyparse}����ʼ�����Ĵ���.

@example
@group
int
main (void)
@{
  return yyparse ();
@}
@end group
@end example

@node Rpcalc Error
@subsection ���󱨸�Ĺ���-The Error Reporting Routine
@cindex ���󱨸�Ĺ���(error reporting routine)

��@code{yyparse}��⵽�﷨�����ʱ��,
������ô��󱨸溯��@code{yyerror}����ӡһ��������Ϣ(������������@code{"syntax error"}).
@code{yyparse}��Ҫ����Ա���ṩ@code{yyerror}(@pxref{Interface, ,������C���Խӿ�-Parser C-Language Interface}),
��������ʹ�������Ķ���:

@example
@group
#include <stdio.h>

/* Called by yyparse on error.  */
void
yyerror (char const *s)
@{
  fprintf (stderr, "%s\n", s);
@}
@end group
@end example

��@code{yyerror}����֮��,
����﷨�������ʵ��Ĵ������(@pxref{Error Recovery, ,����ָ�-Error Recovery})
Bison���������ԴӴ����лָ����Ҽ�������.
����,@code{yyparse}���ط���ֵ.
��������������в�û�б�д�κδ������,
�����κ���Ч������ᵼ�¼����������˳�.
����������Ȼ���������ļ������ǲ����õ�,
�����㹻�����������.

@node Rpcalc Gen
@subsection ����Bison������������-Running Bison to Make the Parser
@cindex ����Bison(���)(running Bison (introduction))

(@pxref{Grammar Layout, ,Bison�﷨�ļ��Ĳ���-The Overall Layout of a Bison Grammar}).
������Bison���������֮ǰ,����Ҫ������ΰ�Դ���밲����һ������Դ�ļ���.
��������һ���򵥵�������˵,
��򵥵ķ������ǰ����еĶ����ŵ�һ���ļ���.
@code{yylex},@code{yyerror}��@code{main}����ĩβ��@var{epilogue}������.

����һ���󹤳���˵,����ܻ��кܶ��Դ�����ļ�,
��ʱ������Ҫʹ��@code{make}�������ǵ��ر���.

��Ϊ���еĴ��붼��һ���ļ���,
��ʹ������������ת����һ���������ļ�:

@example
bison @var{file_name}.y
@end example

@noindent
�����������,����ļ���@file{rpcalc.y}(���� ``Reverse Polish @sc{calc}ulator'').
Bison����һ����Ϊ@file{@var{file_name}.tab.c}���ļ�.
���ҽ�ԭ�ļ���@samp{.y}����չ����ȥ.
�������еĶ��⺯��(@code{yylex},@code{yyerror}��@code{main})�����ֵظ��Ƶ�����ļ�.


@node Rpcalc Compile
@subsection ����������ļ�-Compiling the Parser File
@cindex ���������(compiling the parser)

�������α��벢���з������ļ�:

@example
@group
# @r{�г���ǰĿ¼���ļ�.}
$ @kbd{ls}
rpcalc.tab.c  rpcalc.y
@end group

@group
# @r{����Bison������.}
# @r{@samp{-lm} ���߱�����������@code{pow}ƥ��Ŀ�.}
$ @kbd{cc -lm -o rpcalc rpcalc.tab.c}
@end group

@group
# @r{�ٴ����ļ�.}
$ @kbd{ls}
rpcalc  rpcalc.tab.c  rpcalc.y
@end group
@end example

�ļ�@file{rpcalc}�����Ѿ������˿�ִ�д���.
�����ʹ��@code{rpcalc}�ĻỰ������:

@example
$ @kbd{rpcalc}
@kbd{4 9 +}
13
@kbd{3 7 + 3 4 5 *+-}
-13
@kbd{3 7 + 3 4 5 * + - n}              @r{ע�⸺�Ų�����, @samp{n}}
13
@kbd{5 6 / 4 n +}
-3.166666667
@kbd{3 4 ^}                            @r{������}
81
@kbd{^D}                               @r{�ļ�������ʶ��}
$
@end example

@node Infix Calc
@section ��׺���ż�����:@code{calc}-Infix Notation Calculator: @code{calc}
@cindex ��׺���ż�����(infix notation calculator)
@cindex @code{calc}
@cindex ������(calculator), ��׺����(infix notation)

�������ǿ���ͨ���޸�rpcalcʹ�䴦����׺������.
��׺�������漰���˲��������ȼ��ĸ����Լ�������ȵ�����Ƕ��.
������@file{calc.y},һ����׺����������Ĵ���.


@example
/* Infix notation calculator.  */
/* ��׺���ż����� */

%@{
  #define YYSTYPE double
  #include <math.h>
  #include <stdio.h>
  int yylex (void);
  void yyerror (char const *);
%@}

/* Bison declarations.  */
%token NUM
%left '-' '+'
%left '*' '/'
%left NEG     /* negation--unary minus */ /* ���� */
%right '^'    /* exponentiation */ /* ������ */

%% /* The grammar follows.  */ /*���������﷨ */
input:    /* empty */
        | input line
;

line:     '\n'
        | exp '\n'  @{ printf ("\t%.10g\n", $1); @}
;

exp:      NUM                @{ $$ = $1;         @}
        | exp '+' exp        @{ $$ = $1 + $3;    @}
        | exp '-' exp        @{ $$ = $1 - $3;    @}
        | exp '*' exp        @{ $$ = $1 * $3;    @}
        | exp '/' exp        @{ $$ = $1 / $3;    @}
        | '-' exp  %prec NEG @{ $$ = -$2;        @}
        | exp '^' exp        @{ $$ = pow ($1, $3); @}
        | '(' exp ')'        @{ $$ = $2;         @}
;
%%
@end example

@noindent
@code{yylex},@code{yyerror}��@code{main}��������һ������һ��.

��δ���չʾ��������Ҫ��������.

�ڵڶ�������(@var{Bison declarations}),
@code{%left}�����˼Ǻ����Ͳ���ָ�����������ϲ�����.
@code{%left}��@code{%right}(�ҽ��)������������@code{%token}.
@code{%token}����������û�н���ԵļǺ����͵�.
(��Щ�Ǻ�(ע:��ָ@samp{'+'},@samp{'-'},@samp{'*'},@samp{'/'},@samp{'NEG'})
��ԭ�������������ĵ��ַ��Ǻ�.�����������ǵ�Ŀ����ָ�����ǵĽ����.)

���������ȼ��������������е�˳�������.
�к�Խ��Ĳ�����(��һҳ������Ļ�׶�)����Խ�ߵ����ȼ�.
���,���������������ȼ�,����(@code{NEG})���,
������@samp{*}��@samp{/}�ȵ�.
@xref{Precedence, ,���������ȼ�-Operator Precedence}.

����һ����Ҫ�����������﷨���ֵĸ��Ų�������ʹ����@code{%prec}.
�﷨�е�@code{%prec}ֻ�Ǽ򵥵ĸ���Bison����@samp{| '-' exp}��@code{NEG}����ͬ�����ȼ�---��ǰ�������ȼ�������.
@xref{Contextual Precedence, ,���������ĵ����ȼ�-Context-Dependent Precedence}.

�����һ������@file{calc.y}������:

@need 500
@example
$ @kbd{calc}
@kbd{4 + 4.5 - (34/(8*3+-3))}
6.880952381
@kbd{-56 + 2}
-54
@kbd{3 ^ 2}
9
@end example

@node Simple Error Recovery
@section �򵥵Ĵ���ָ�-Simple Error Recovery
@cindex ����ָ�(error recovery), ��(simple)

ֱ����һ��֮ǰ,����ֲᲢδ�ἰ@dfn{����ָ�(error recovery)}������---
���ڷ�������⵽����֮����μ�������.
����������Ҫ����������Ǳ�д@code{yyerror}����.
���ǿ��Ի���һ����ǰ������,
@code{yyparse}�ڵ���@code{yyerror}�󷵻�.
�����ζ����һ�����������ᵼ�¼����������˳�.
�������Ǿ�չʾ��θ����������.

Bison�����Լ������˿��Բ��뵽�﷨������ȥ�ı�����@code{error}.
�����������,�������ӵ�@code{line}��һ����ѡ�Ĺ�����.

@example
@group
line:     '\n'
        | exp '\n'   @{ printf ("\t%.10g\n", $1); @}
        | error '\n' @{ yyerrok;                  @}
;
@end group
@end example

������ӵĹ����������﷨��������ʱ���м򵥵Ĵ���ָ�����.
���һ������һ���޷���ֵ�ı���ʽ,
�������ᱻʶ���@code{line}�ĵ����������ҷ��������ִ��.
(@code{yyerror}�����Իᱻ��������ӡ������Ϣ).
ִ��������������@code{yyerrok}��һ����Bison�Զ�����ĺ�.
���ĺ����Ǵ���ָ��Ѿ����(@pxref{Error Recovery, ,����ָ�-Error Recovery}).
����Ӧ��ע�⵽@code{yyerror}��@code{yyerrok}������,
���ǵ�ӡˢ��û�д���.

������ʽ�Ĵ���ָ����ڴ����﷨����.
���кܶ�������ʽ�Ĵ���;
����,����Ϊ0,������һ��ͨ���������쳣�ź�(an exception signal).
һ�������ļ��������봦�������źŲ���ʹ��@code{longjmp}���ص�@code{main}���Ҽ�������������;
��(ע:�����ļ�����)Ҳ���Զ���ʣ���������.
���ǲ�������������������,
��Ϊ����Bison�����޹�.

@node Location Tracking Calc
@section ����λ��׷�ٵļ�����:@code{ltcalc}-Location Tracking Calculator: @code{ltcalc}
@cindex λ��׷��(location tracking calculator)
@cindex @code{ltcalc}
@cindex ������(calculator), λ��׷��(location tracking)

������ӽ���׺���ż�������չ��ʹ�����λ��׷�ٹ���.
�����������Ӧ���ڸĽ�������Ϣ����ʾ.
Ϊ�˰ѱ��ּ����,
���������һ���򵥵�����������.
Ϊ��ʹ��λ��,������������ڴʷ������������.

@menu
* ����(Decls): Ltcalc Decls.  ltcalc��Bison��C���Ե�����
* ����(Rules): Ltcalc Rules.  ��ϸ����ltcalc���﷨����
* �ʷ�������(Lexer): Ltcalc Lexer.  �ʷ�������
@end menu

@node Ltcalc Decls
@subsection @code{ltcalc}��@var{Declarations}-Declarations for @code{ltcalc}

λ��׷�ټ�������C��Bison������������׺���ż�����������������ͬ.

@example
/* Location tracking calculator.  */
/* λ��׷�ټ����� */

%@{
  #define YYSTYPE int
  #include <math.h>
  int yylex (void);
  void yyerror (char const *);
%@}

/* Bison declarations.  */
/* Bison ���� */
%token NUM

%left '-' '+'
%left '*' '/'
%left NEG
%right '^'

%% /* The grammar follows.  */ /* �������﷨ */
@end example

@noindent
ע�⵽��û��λ�õ��ر�����.
������Ҫ����һ���洢λ�õ���������:
����ʹ��Bison�ṩ��Ĭ�ϵ�����(@pxref{Location Type, ,λ�õ���������-Data Types of Locations}).
�������������Ǵ����ĸ�������Ľṹ��:
@code{first_line},@code{first_column},@code{last_line}��@code{last_column}.

@node Ltcalc Rules
@subsection @code{ltcalc}���﷨����-Grammar Rules for @code{ltcalc}

�Ƿ���λ�ö���������Ե��﷨��û��Ӱ��.
���,������Ե��﷨������ǰһ�����ӵķǳ��ӽ�;
���ǽ����޸������Ի�ȡ�µ���Ϣ.

������,����ʹ��λ�����������Ϊ0���ҶԴ���ı���ʽ���ӱ���ʽ���ж�λ.

@example
@group
input   : /* empty */
        | input line
;
@end group

@group
line    : '\n'
        | exp '\n' @{ printf ("%d\n", $1); @}
;
@end group

@group
exp     : NUM           @{ $$ = $1; @}
        | exp '+' exp   @{ $$ = $1 + $3; @}
        | exp '-' exp   @{ $$ = $1 - $3; @}
        | exp '*' exp   @{ $$ = $1 * $3; @}
@end group
@group
        | exp '/' exp
            @{
              if ($3)
                $$ = $1 / $3;
              else
                @{
                  $$ = 1;
                  fprintf (stderr, "%d.%d-%d.%d: division by zero",
                           @@3.first_line, @@3.first_column,
                           @@3.last_line, @@3.last_column);
                @}
            @}
@end group
@group
        | '-' exp %preg NEG     @{ $$ = -$2; @}
        | exp '^' exp           @{ $$ = pow ($1, $3); @}
        | '(' exp ')'           @{ $$ = $2; @}
@end group
@end example

��δ���չʾ����ζԹ��򲿼�ʹ��α����@code{@@@var{n}}
�Լ�����ʹ��α����@code{@@$}�����嶯����ȷ��λ��.

���ǲ���Ҫ��@code{@@$}��ֵ:������������Զ�������.
Ĭ�ϵ�,��ִ��ÿ��������C����֮ǰ,
����һ������@var{n}�������Ĺ���,
@code{@@$}���趨Ϊ��@code{@@1}�Ŀ�ʼ��@code{@@@var{n}}�Ľ���.
���ǿ������¶����������(@pxref{Location Default Action, ,λ�õ�Ĭ�϶���-Default Action for Locations}),
����һЩ����Ĺ���,@code{@@$}�����ֶ�����.

@node Ltcalc Lexer
@subsection @code{ltcalc}�Ĵʷ�������-The @code{ltcalc} Lexical Analyzer.

ֱ������,������Ȼ������Bison��Ĭ��������λ��׷��.
��һ����������д�ʷ�������,
����ʹ�����﷨�������ļǺ�λ�����ʺ�,
�������Ѿ�Ϊ����ֵ��������.

�����,Ϊ�˱�������λ�ó���,���Ǳ����ÿ�������ַ����м���.

@example
@group
int
yylex (void)
@{
  int c;
@end group

@group
  /* Skip white space.  */
  /* �����հ� */
  while ((c = getchar ()) == ' ' || c == '\t')
    ++yylloc.last_column;
@end group

@group
  /* Step.  */
  yylloc.first_line = yylloc.last_line;
  yylloc.first_column = yylloc.last_column;
@end group

@group
  /* Process numbers.  */
  /* �������� */
  if (isdigit (c))
    @{
      yylval = c - '0';
      ++yylloc.last_column;
      while (isdigit (c = getchar ()))
        @{
          ++yylloc.last_column;
          yylval = yylval * 10 + c - '0';
        @}
      ungetc (c, stdin);
      return NUM;
    @}
@end group

  /* Return end-of-input.  */
  /* ����������� */
  if (c == EOF)
    return 0;

  /* Return a single char, and update location.  */
  /* ����һ�����ַ�,���Ҹ���λ�� */
  if (c == '\n')
    @{
      ++yylloc.last_line;
      yylloc.last_column = 0;
    @}
  else
    ++yylloc.last_column;
  return c;
@}
@end example

�ʷ���������������������ǰһ��������ͬ�Ĵ���:
�������˿ո���Ʊ���,���Ҷ��������൥�ַ��Ǻ�.
�����,�������˺��мǺ�λ�õ�ȫ�ֱ���(������@code{YYLTYPE})@code{yyloc}.

����,ÿ�������������һ���Ǻ�,������ֵһ��,
����������������Ǻŵı�ź���������λ��.
�����Ҫ�ı�ľ��ǳ�ʼ��@code{yyloc}.
�����ڿ��ƺ�����:

@example
@group
int
main (void)
@{
  yylloc.first_line = yylloc.last_line = 1;
  yylloc.first_column = yylloc.last_column = 0;
  return yyparse ();
@}
@end group
@end example

Ҫ��ס:����λ�ò������﷨������.
ÿ���ַ��������һ��λ�ø���,
����������һ����Ч�������л�����ע���л����ַ����еȵ�.

@node Multi-function Calc
@section �๦�ܼ�����:@code{mfcalc}-Multi-Function Calculator: @code{mfcalc}
@cindex �๦�ܼ�����(multi-function calculator)
@cindex @code{mfcalc}
@cindex ������(calculator), �๦��(multi-function)

������Ϊֹ,�����Ѿ�������Bison�Ļ�������.
��ʱ��ȥת�Ƶ�һЩ�߼���������ȥ.
�����ļ����������ṩ���������,
@samp{+},@samp{-},@samp{*},@samp{/}��@samp{^}.
�����ǵļ������ṩ������ѧ������@code{sin},@code{cos}�ȵ���һ���������뷨.

һ���µĲ�����ֻ�ǵ��ַ�,���������ӵ���׺�������Ǻܼ򵥵�����.
�ʷ�������@code{yylex}�����з������ַ����سɼǺ�,
�����µ��﷨��������µĲ�������˵�㹻��.
����������ҪһЩ�����Ķ���:�������ָ�ʽ���ڽ�����:

@example
@var{function_name} (@var{argument})
@end example

@noindent
ͬʱ,���ǿ���������������Ϊ���������Ӽ��书��.
���ǿ����������д洢��ֵ,�����Ժ�ʹ������.
����Ƕ๦�ܼ�������һ���Ự������:

@example
$ @kbd{mfcalc}
@kbd{pi = 3.141592653589}
3.1415926536
@kbd{sin(pi)}
0.0000000000
@kbd{alpha = beta1 = 2.3}
2.3000000000
@kbd{alpha}
2.3000000000
@kbd{ln(alpha)}
0.8329091229
@kbd{exp(ln(beta1))}
2.3000000000
$
@end example

ע�⵽���ظ�ֵ��Ƕ�׺���������ʹ�õ�.

@menu
* ����(Decl): Mfcalc Decl.      �๦�ܼ�������Bison����
* ����(Rules): Mfcalc Rules.    ���������﷨����
* ���ű�(Symtab): Mfcalc Symtab.  ���ű���������
@end menu

@node Mfcalc Decl
@subsection @code{mfcalc}������-Declarations for @code{mfcalc}

����Ƕ๦�ܼ�������C��Bison��������:

@smallexample
@group
%@{
  #include <math.h>  /* For math functions, cos(), sin(), etc.  */ /* Ϊ��ʹ����ѧ����, cos(), sin(), �ȵ� */
  #include "calc.h"  /* Contains definition of `symrec'.  */ /* ������ `symrec'�Ķ��� */
  int yylex (void);
  void yyerror (char const *);
%@}
@end group
@group
%union @{
  double    val;   /* For returning numbers.  */ /* ���ص���ֵ */
  symrec  *tptr;   /* For returning symbol-table pointers.  */ /* ���صķ��ű�ָ�� */
@}
@end group
%token <val>  NUM        /* Simple double precision number.  */ /* �򵥵�˫������ֵ */
%token <tptr> VAR FNCT   /* Variable and Function.  */ /* �����ͺ��� */
%type  <val>  exp

@group
%right '='
%left '-' '+'
%left '*' '/'
%left NEG     /* negation--unary minus */ /* ���� */
%right '^'    /* exponentiation */ /* �� */
@end group
%% /* The grammar follows.  */ 
@end smallexample

�������﷨��������������Bison���Ե�������.
��Щ������������ֵӵ�ж�����������.
(@pxref{Multiple Types, ,����ֵ����-More Than One Value Type}).

@code{%union}���������п��������嵥;
��������ȡ��@code{YYSTYPE}��.
����������������˫����(Ϊ��@code{exp}��@code{NUM})��ָ����ű�Ŀ¼���ָ��.
@xref{Union Decl, ,ֵ���ͼ�-The Collection of Value Types}.

��������ֵֵ���ڿ����ж�������,
��ÿһ��ʹ������ֵ���﷨���Ź���һ������ֵ�����Ǻܱ�Ҫ��.
��Щ������@code{NUM},@code{VAR},@code{FNCT},��@code{exp}.
���ǵ���������ʱ���Ѿ�ָ��������ֵ����(��������֮��).

@code{%type}�����������ս��,����@code{%token}����������������(ע:�ս��)��һ��.
����֮ǰ��û��@code{%type}����Ϊ���ս�������ڶ������ǵĹ���������������.
����@code{exp}���뱻��ȷ�������Ա�����ʹ����������ֵ����.
@xref{Type Decl, ,���ս��-Nonterminal Symbols}.

@node Mfcalc Rules
@subsection @code{mfcalc}���﷨����-Grammar Rules for @code{mfcalc}

����Ƕ๦�ܼ��������﷨����.
����֮�еĴ�������Ǵ�@code{calc}���ƹ�����;
�����ᵽ@code{VAR}����@code{FNCT}�Ĺ�����������.

@smallexample
@group
input:   /* empty */
        | input line
;
@end group

@group
line:
          '\n'
        | exp '\n'   @{ printf ("\t%.10g\n", $1); @}
        | error '\n' @{ yyerrok;                  @}
;
@end group

@group
exp:      NUM                @{ $$ = $1;                         @}
        | VAR                @{ $$ = $1->value.var;              @}
        | VAR '=' exp        @{ $$ = $3; $1->value.var = $3;     @}
        | FNCT '(' exp ')'   @{ $$ = (*($1->value.fnctptr))($3); @}
        | exp '+' exp        @{ $$ = $1 + $3;                    @}
        | exp '-' exp        @{ $$ = $1 - $3;                    @}
        | exp '*' exp        @{ $$ = $1 * $3;                    @}
        | exp '/' exp        @{ $$ = $1 / $3;                    @}
        | '-' exp  %prec NEG @{ $$ = -$2;                        @}
        | exp '^' exp        @{ $$ = pow ($1, $3);               @}
        | '(' exp ')'        @{ $$ = $2;                         @}
;
@end group
/* End of grammar.  */
%%
@end smallexample

@node Mfcalc Symtab
@subsection @code{mfcalc}�ķ��ű�-The @code{mfcalc} Symbol Table
@cindex ���ű�ʵ��(symbol table example)

�๦�ܼ�������Ҫһ�����ű���׷�ٱ����ͷ��ŵ����ƺ�����.
�Ⲣ��Ӱ���﷨����(���˶�������)����Biosn����.
������Ҫ��һЩ�����C����֧��.

���ű������ɼ�¼���������.
���Ķ�����ͷ�ļ�@file{calc.h}��,����.
���ṩ�˽��������߱���������ű��Ĺ���.

@smallexample
@group
/* Function type.  */
/* �������� */
typedef double (*func_t) (double);
@end group

@group
/* Data type for links in the chain of symbols.  */
/* �����ڵ���������� */
struct symrec
@{
  char *name;  /* name of symbol */ /* ���ŵ����� */
  int type;    /* type of symbol: either VAR or FNCT */ /* ���ŵ�����: VAR �� FNCT */
  union
  @{
    double var;      /* value of a VAR */ /* VAR ��ֵ */
    func_t fnctptr;  /* value of a FNCT */ /* FNCT ��ֵ */
  @} value;
  struct symrec *next;  /* link field */ /* ָ���� */
@};
@end group

@group
typedef struct symrec symrec;

/* The symbol table: a chain of `struct symrec'.  */
/* ���ű�: `struct symrec'������ */
extern symrec *sym_table;

symrec *putsym (char const *, func_t);
symrec *getsym (char const *);
@end group
@end smallexample

�°汾��@code{main}������һ��@code{init_table}�ĵ���,
�������������ʼ�����ű�.
�����@code{main}��@code{init_table}�Ĵ���:

@smallexample
#include <stdio.h>

@group
/* Called by yyparse on error.  */
/* ����ʱ��yyparse���� */
void
yyerror (char const *s)
@{
  printf ("%s\n", s);
@}
@end group

@group
struct init
@{
  char const *fname;
  double (*fnct) (double);
@};
@end group

@group
struct init const arith_fncts[] =
@{
  "sin",  sin,
  "cos",  cos,
  "atan", atan,
  "ln",   log,
  "exp",  exp,
  "sqrt", sqrt,
  0, 0
@};
@end group

@group
/* The symbol table: a chain of `struct symrec'.  */
/* ���ű�: `struct symrec'���� */
symrec *sym_table;
@end group

@group
/* Put arithmetic functions in table.  */
/* ����ѧ����������ű�(ע:�����ֵ�ʵ�ַ�ʽ) */
void
init_table (void)
@{
  int i;
  symrec *ptr;
  for (i = 0; arith_fncts[i].fname != 0; i++)
    @{
      ptr = putsym (arith_fncts[i].fname, FNCT);
      ptr->value.fnctptr = arith_fncts[i].fnct;
    @}
@}
@end group

@group
int
main (void)
@{
  init_table ();
  return yyparse ();
@}
@end group
@end smallexample

���򵥵ر༭��ʼ���б������ӱ�Ҫ��ͷ�ļ�,
�����Ϊ���������Ӷ���Ĺ���.

������Ҫ�ĺ��������Է��ű����������Ͱ��ò���.
@code{putsym}������Ҫ����Ҫ���ö�������ƺ�����(@code{VAR}��@code{FNCT}).
�������ӵ�������ͷ��,һ��ָ����������ָ����󱻷���.
@code{getsym}����Ҫ������Ҫ���ҵķ��ŵ�����.
����ҵ�,ָ���Ǹ����ŵ�ָ��ط���,���򷵻�0.

@smallexample
symrec *
putsym (char const *sym_name, int sym_type)
@{
  symrec *ptr;
  ptr = (symrec *) malloc (sizeof (symrec));
  ptr->name = (char *) malloc (strlen (sym_name) + 1);
  strcpy (ptr->name,sym_name);
  ptr->type = sym_type;
  ptr->value.var = 0; /* Set value to 0 even if fctn.  */ /* ��0��ʹ��fctn */
  ptr->next = (struct symrec *)sym_table;
  sym_table = ptr;
  return ptr;
@}

symrec *
getsym (char const *sym_name)
@{
  symrec *ptr;
  for (ptr = sym_table; ptr != (symrec *) 0;
       ptr = (symrec *)ptr->next)
    if (strcmp (ptr->name,sym_name) == 0)
      return ptr;
  return 0;
@}
@end smallexample

@code{yylex}�������ڱ�����ʶ�������,����ֵ�͵��ַ�����������.
��ͷΪ�������ֵ��ַ�����ʶ��Ϊ�������Ǻ��������ڷ��ű������ǵ�����.

�ַ��������ݵ�@code{getsym}�����ڷ��ű��в���.
������Ƴ����ڱ�����,ָ������λ�õ�ָ����������ͻ᷵�ظ�@code{yyparse}.
�����δ�����ڷ��ű���,���ᱻ����Ϊһ��@code{VAR}ʹ�ú���@code{putsym}.
ͬ����,һ��ָ�����������(������@code{VAR})�����ظ�@code{yyparse}.

@code{yylex}�д��������ƺ�����������Ĵ��벢����Ҫ����.

@smallexample
@group
#include <ctype.h>
@end group

@group
int
yylex (void)
@{
  int c;

  /* Ignore white space, get first nonwhite character.  */
  /* ���Կհ�,��ȡ��һ���ǿհ׵��ַ� */
  while ((c = getchar ()) == ' ' || c == '\t');

  if (c == EOF)
    return 0;
@end group

@group
  /* Char starts a number => parse the number.         */
  /* �����ֿ�ͷ => �������� */
  if (c == '.' || isdigit (c))
    @{
      ungetc (c, stdin);
      scanf ("%lf", &yylval.val);
      return NUM;
    @}
@end group

@group
  /* Char starts an identifier => read the name.       */
  /* �Ա�ʶ����ͷ => ��ȡ���� */
  if (isalpha (c))
    @{
      symrec *s;
      static char *symbuf = 0;
      static int length = 0;
      int i;
@end group

@group
      /* Initially make the buffer long enough
         for a 40-character symbol name.  */
      /* �ڿ�ʼ��ʱ��ʹ�������㹻����40�ַ����ķ�������*/
      if (length == 0)
        length = 40, symbuf = (char *)malloc (length + 1);

      i = 0;
      do
@end group
@group
        @{
          /* If buffer is full, make it bigger.        */
          /* �������������,ʹ����һ�� */
          if (i == length)
            @{
              length *= 2;
              symbuf = (char *) realloc (symbuf, length + 1);
            @}
          /* Add this character to the buffer.         */
          /* ������ַ����뻺���� */
          symbuf[i++] = c;
          /* Get another character.                    */
          /* ��ȡ����һ���ַ� */
          c = getchar ();
        @}
@end group
@group
      while (isalnum (c));

      ungetc (c, stdin);
      symbuf[i] = '\0';
@end group

@group
      s = getsym (symbuf);
      if (s == 0)
        s = putsym (symbuf, VAR);
      yylval.tptr = s;
      return s->type;
    @}

  /* Any other character is a token by itself.        */
  /* ������ַ����Լ�Ϊ�Ǻŵ��ַ� */
  return c;
@}
@end group
@end smallexample

����������Ч�����.
��������ɵؼ����µĺ���.
���Ҽ�����Ԥ������ֵ��@code{pi}����@code{e}Ҳ�Ǻܼ򵥵�����.

@node Exercises
@section ��ϰ-Exercises
@cindex ��ϰ(exercises)

@enumerate
@item
���ļ�@file{math.h}�еĳ�ʼ�б������µĺ���.

@item
��������һ������������������ֵ������.
Ȼ���޸�@code{init_table}����Щ�������ӵ����ű�.
ʹ��Щ��������Ϊ@code{VAR}���.

@item
ʹ��������û�����һ��δ��ʼ���ı���ʱ����һ������.
@end enumerate

@node Grammar File
@chapter Biosn���﷨�ļ�-Bison Grammar Files

Bisonʹ��һ�������������޹��ķ����ļ���Ϊ����,
������һ��ʵ����ķ�����ȷʵ����C���Ժ���.

Bison�﷨�����ļ�ͨ����@samp{.y}��β.@xref{Invocation, ,����Bison-Invoking Bison}.

@menu             
* �﷨���(Grammar Outline):Grammar Outline.   �﷨�ļ������岼��
* ����(Symbols):Symbols.           �ս������ս��
* ����(Rules):Rules.             ��α�д�﷨����
* �ݹ�(Resursion):Recursion.         ��д�ݹ����
* ����(Semantics):Semantics.         ����ֵ�Ͷ���
* λ��(Locations):Locations.         λ�úͶ���
* ����(Declarations):Declarations.      ���������Bison��������������
* ���������(Multiple Parsers):Multiple Parsers.  �����Bison����������һ��������
@end menu

@node Grammar Outline
@section Bison�﷨�����-Outline of a Bison Grammar

һ��Bison�﷨�ļ����ĸ���Ҫ�Ĳ���,
����������ʾ,��ǡ���ķָ����ָ�.

@example
%@{
  @var{Prologue}
%@}

@var{Bison declarations}

%%
@var{Grammar rules}
%%

@var{Epilogue}
@end example

ע�Ͱ�����@samp{/* @dots{} */}֮��,���ҿ��������ⲿ�ֳ���.
��Ϊһ��@acronym{GNU}��չ,@samp{//}������һ��ֱ������ĩβ��ע��.

@menu
* Prologue::          Prologue���ֵ��﷨��ʹ��
* Bison Declarations::  Bison declarations���ֵ��﷨��ʹ��
* Grammar Rules::     Grammar Rules���ֵ��﷨��ʹ��
* Epilogue::          Epilogue���ֵ��﷨��ʹ��
@end menu

@node Prologue
@subsection @var{Prologue}����-The prologue
@cindex ��������(declarations section)
@cindex Prologue
@cindex ����(declarations)

@var{Prologue}���ְ����궨������﷨��������ʹ�õĺ����ͱ���������.
��Щ�����Ƶ��������ļ��Ŀ�ͷ�Ա�����@code{yyparse}�Ķ���.
�����ʹ��@samp{#include}����ͷ�ļ���ȡ����.
����㲻��Ҫ�κε�C����,�����ʡ��������ֵ����ŷָ���@samp{%@{}��@samp{%@}}.

�����ж����@var{Bison declarations}��ϵ�@var{Prologue}����.
��������������ӵ���໥���õ�C��Bison����.
����,@code{%union}����ʹ�ö�����ͷ�ļ�����������,
������ϣ��ʹ�ô���@code{YYSTYPE}������Ϊ�����ĺ���.
����ͨ������@var{Prologue}����ʵ�����,
һ����@code{%union}֮ǰ,��һ����֮��.

@smallexample
%@{
  #include <stdio.h>
  #include "ptypes.h"
%@}

%union @{
  long int n;
  tree t;  /* @r{@code{tree} is defined in @file{ptypes.h}.} */ 
           /* @r{@code{tree} ��@file{ptypes.h}�ж���.} */
@}

%@{
  static void print_token_value (FILE *, int, YYSTYPE);
  #define YYPRINT(F, N, L) print_token_value (F, N, L)
%@}

@dots{}
@end smallexample

@node Bison Declarations
@subsection @var{Bison Declarations}����-The Bison Declarations Section
@cindex Bison����(���)(Bison declarations (introduction))
@cindex ����(declarations), Bison(���)(Bison (introduction))

@var{Bison declatations}���ְ����˶����ս���ͷ��ս��������,���ȼ��ȵ�.
��һЩ�򵥵��﷨��,���Բ���Ҫ�κ�����.
@xref{Declarations, ,@var{Bison Declarations}����-Bison Declarations}.

@node Grammar Rules
@subsection �﷨���򲿷�-The Grammar Rules Section
@cindex �﷨���򲿷�(grammar rules section)
@cindex �﷨�Ĺ��򲿷�(rules section for grammar)

@dfn{Grammar Rules}���ְ�����һ������Bison�﷨����.
@xref{Rules, ,������ʾ�﷨������﷨-Syntax of Grammar Rules}.

����������Ӧ����һ���﷨����,���ҵ�һ��@samp{%%}(�����﷨������Ǹ�)���Բ���ʡ��,���������ļ����ͷ.

@node Epilogue
@subsection @var{Epilogue}����-The epilogue
@cindex ����C���벿��(additional C code section)
@cindex epilogue
@cindex C����(C code), ���ⲿ��(section for additional)

����@var{Prologue}���ֱ����Ƶ���ͷһ��,@var{Epilogue}���ֱ����ֵظ��Ƶ��������ļ��Ľ�β.
��������һЩ����ȴû��Ҫ����@code{yyparse}�Ķ���֮ǰ,���������ĵط�.
����,@code{yylex}��@code{yyerror}�Ķ���;�����������.
��ΪC����Ҫ������ʹ��֮ǰ��������.
�㾭����Ҫ��@var{Prologue}������������@code{yylex}��@code{yyerror}�ĺ���,
��ʹ����@var{Epilogue}�����Ѿ�����������.
@xref{Interface, ,������C���Խӿ�-Parser C-Language Interface}.

������һ����Ϊ��,�����ʡ�Էָ����ķָ���@samp{%%}.

Bison�������Լ�������������@samp{yy}��@samp{YY}��ͷ��ͱ�ʶ���Ķ���.
������@var{Epilogue}���ֱ���ʹ���������͵�����(��������ĵ����۵�֮��)��һ��������.

@node Symbols
@section ����,�ս���ͷ��ս��-Symbols, Terminal and Nonterminal
@cindex ���ս��(nonterminal symbol)
@cindex �ս��(terminal symbol)
@cindex ��������(token type)
@cindex ����(symbol)

Bison�﷨�е�@dfn{����(Symbols)}���������Ե��﷨����.

һ��@dfn{�ս��(terminal symbol)}(Ҳ������@dfn{��������(token type)}������һ��ӹ����ϵȼ۵ļǺ�.
�����﷨��ʹ�÷��ŵ���˼����һ���������͵ļǺ���������.
Bison�����������ű�ʾΪ������.
@code{yylex}����һ���Ǻ�������ָ��һ��������ļǺ���ʲô���͵�.
�㲻��Ҫ�˽��Ǹ������ֵ�Ƕ���;
��ʹ�ô������ķ��žͿ�����.

һ��@dfn{���ս��(noterminal symbol)}����һ��ӹ����ϵȼ۵���.
�����������ڱ�д�﷨����.
���չ���,���еķ��ս����Ӧ����Сд��.

�������ƿ�������ĸ,����(���ڿ�ͷ),�»��ߺ;��.
���ֻ�ڷ��ս����������.

���﷨����д�ս�������ַ���:

@itemize @bullet
@item
һ��@dfn{������������(named token type)}������C���Եı�ʶ����д.
���չ���,����Ӧ���Ǵ�д��ĸ.
ÿһ���������Ʊ�����һ��Bison����@code{%token}����.
@xref{Token Decl, ,�������͵�����-Token Type Names}.

@item
@cindex �ַ��Ǻ�(character token)
@cindex ���ּǺ�(literal token)
@cindex ���ַ�����(single-character literal)
һ��@dfn{�ַ��Ǻ�����(character token type}(����@dfn{�����ַ��Ǻ�(literal character token)}
����ͬC�����ַ�������ͬ���﷨��д;
����,@code{'+'}��һ���ַ��Ǻ�����.
������Ҫָ���ַ��Ǻ����͵�����ֵ����(@pxref{Value Type, ,����ֵ����������-Data Types of Semantic Values}),
����Ի����ȼ�(@pxref{Precedence, ,���������ȼ�-Operator Precedence}),
����û�б�Ҫ��������.

���չ���,һ���ַ��Ǻ�����ֻ���ڱ�ʾһ�����ض��ַ���ɵļǺ�.
���,�Ǻ�����@code{'+'}���ڽ��ַ�@samp{+}��ʾΪһ���Ǻ�.
û�жԴ˹�����ǿ��Ҫ��,
��������㲻���չ�����,
��ĳ����ʹ�����Ķ��߸е�����.

���г��õ�C���Ե��ַ�ת�����ж�������Bison��ʹ��,
�����㲻��ʹ��һ�����ַ���Ϊһ���ַ�����.
��Ϊ������������0,���ʾ�������.(@pxref{Calling Convention, ,@code{yylex}�ĵ��ù���-Calling Convention for @code{yylex}}).
����,�����׼C@
���ַ���(trigraphs)(ע:��``??''��ͷ�ľ���ת��,Ϊ����ȱ�ٱ�׼C����������ʹ�ñ�׼C,�ɲο���׼C�ĵ�)
��Bison�в�û���������岢�ҷ�б�ܻ���Ҳ�ǲ�������.

@item
@cindex �ַ����Ǻ�(string token)
@cindex ���ִ��Ǻ�(literal string token)
@cindex ���ַ�����(multicharacter literal)
һ��@dfn{���ִ��Ǻ�(literal string token)}������C�����е��ַ�����������д;
����,@code{"<="}��һ�����ִ��Ǻ�.
������Ҫָ�����ִ��Ǻŵ�����ֵ����(@pxref{Value Type, ,ֵ����-Value Type}),
����Ի����ȼ�(@pxref{Precedence, ,���ȼ�-Precedence}),��û�б�Ҫ��������.

�����ʹ��@code{%token}(@pxref{Token Decl, ,��������-Token Declarations})�����ִ��ǺŹ���һ������������Ϊ����.
����㲻������,�ʷ������������@code{yytname}���������ҵ����ִ��ǺŵĴ���.
(@pxref{Calling Convention, ,���ù���-Calling Convention}).

@strong{����}: ���ִ��Ǻ���Yacc�в��ܹ���.

���չ���,һ�����ִ��Ǻ�ֻ���ڱ�ʾһ�����ض������ɵļǺ�.
���,���ø�ʹ������@code{"<="}��ʾ��Ϊ�Ǻŵ��ַ���@samp{<=}.
Bison��û��ǿ��Ҫ�����ֹ���,���������ƫ���˹���,
�Ķ��������˻�е�����.

���г��õ�C���Ե��ַ�ת�����ж�������Bison��ʹ��,
�����㲻��ʹ��һ�����ַ���Ϊһ���ַ�����.
��Ϊ������������0,���ʾ�������.
(@xref{Calling Convention, ,@code{yylex}�ĵ��ù���-Calling Convention for @code{yylex}}.)
����,�����׼C,
���ַ���(trigraphs)(ע:��``??''��ͷ�ľ���ת��,Ϊ����ȱ�ٱ�׼C����������ʹ�ñ�׼C,�ɲο���׼C�ĵ�)
��Bison�в�û���������岢�ҷ�б�ܻ���Ҳ�ǲ�������.
һ�����ִ��Ǻű�����������������ַ�;
���ڽ�����һ���ַ��ļǺ�,��Ӧ��ʹ���ַ��Ǻ�(�ο�����).
@end itemize

����ѡ���ս����д�����������﷨����û��Ӱ��.
��ֻ�������������ڹ����ʲô�ط��Լ�ʲôʱ��������������Ǹ�����.

@code{yylex}�ķ���ֵͨ�����ս��,���Ƿ���һ���������������0���߸�ֵ.
������������ַ������﷨��������д��������,
��Ӧ����@code{yylex}�Ķ����в�����ͬ��д��.
���ַ��������͵�������򵥵ؾ����Ǹ��ַ�����������,
����,��ʹ��@code{char}���з���ʱ����Ҫ����ת����@code{unsigned char}�����������Ϸ�����չ
@code{yylex}�Կ���ʹ����ͬ��ֵ��������Ҫ�Ĵ���.
ÿһ�������Ǻ������ڷ������ļ��б�Ϊһ��C��,
����@code{yylex}����ʹ�����ƴ����Ǹ�����.
(�����Ϊʲô������ս���в�������.)
@xref{Calling Convention, ,@code{yylex}�ĵ��ù���-Calling Convention for @code{yylex}}.

���@code{yylex}����������ļ��ж����,
����Ҫ���ŷ������͵ĺ궨���������ǿɼ���.
��������Bison��ʱ��ʹ��@samp{-d}ѡ��
�Ա���������Щ�궨��д��һ�������ͷ�ļ�@file{@var{name}.tab.h}.
����Խ�������������Ҫ�����ļ�.
@xref{Invocation, ,����Bison-Invoking Bison}.

�����Ҫ��дһ��������ֲ���κα�׼C�����ϵ��﷨,
�����ֻ�ܴӻ�����׼C�ַ�����ѡ��ʹ�÷����ַ��Ǻ�����.
����ַ�����10������,52����СдӢ����ĸ,��������C�����ַ����е��ַ����ɵ�:

@example
"\a\b\t\n\v\f\r !\"#%&'()*+,-./:;<=>?[\\]^_@{|@}~"
@end example

@code{yylex}������Bison����Ϊ�ַ��Ǻ�ʹ��һ��һ�µ��ַ����ͱ���.
����,�������@acronym{ASCII}����������Bison,
�����ڲ����ݵ�����@acronym{EBCDIC}�Ļ����б�����������յĳ���,
���ճ�����ܲ��Ṥ��.��ΪBison�����ı����ַ��Ǻżٶ�Ϊ@acronym{ASCII}����ֵ.
��������Bison��@acronym{ASCII}�����в�����CԴ�ļ��������Ǳ�׼������,
��������@acronym{ASCII}�����ݵ�ƽ̨�İ�װ�������ڱ�������֮ǰ���¹�����Щ�ļ�.

����@code{error}��һ��������������ָ����ս��(@pxref{Error Recovery, ,����ָ�-Error Recovery});
�㲻Ӧ��Ϊ��������Ŀ�Ķ�ʹ����.
�ر��,@code{yylex}��Զ��Ӧ�÷������ֵ(ע:@code{error}).
��������ȷ���������и���һ����ļǺ�ֵΪ256,����error�Ǻŵ�Ĭ��ֵ��256.

@node Rules
@section �����﷨������﷨-Syntax of Grammar Rules
@cindex �����﷨(rule syntax)
@cindex �﷨������﷨(grammar rule syntax)
@cindex �����﷨������﷨(syntax of grammar rules)

һ��Bison�﷨����ͨ�������µ�����ʽ:

@example
@group
@var{result}: @var{components}@dots{}
        ;
@end group
@end example

@noindent
@var{reault}������������������ķ��ս����@var{components}
�Ǳ�������������һ��Ķ����ս���ͷ��ս��.(@pxref{Symbols, ,����-Symbols})

����:

@example
@group
exp:      exp '+' exp
        ;
@end group
@end example

@noindent
��������@code{exp}���ͺ�һ��@samp{+}�Ǻ����м�,
���Խ�ϳ�һ�������@code{exp}������.

�����еĿհ�ֻ�����ָ�����.���������ϣ���ĵط����Ӷ���Ŀհ�.

��������������@var{����}���Է�ɢ�ڲ�����.һ�����鿴����������:

@example
@{@var{C statements}@}
@end example

@noindent
ͨ��ֻ��һ�����������Ų���.
@xref{Actions, ,����-Actions}.

@findex |
@var{result}�Ķ��ֹ�����Էֱ���д�����ɴ�ֱ��@samp{|}�����µķ�����������:

@ifinfo
@example
@var{result}:   @var{rule1-components}@dots{}
        | @var{rule2-components}@dots{}
        @dots{}
        ;
@end example
@end ifinfo
@iftex
@example
@group
@var{result}:    @var{rule1-components}@dots{}
        | @var{rule2-components}@dots{}
        @dots{}
        ;
@end group
@end example
@end iftex

@noindent
�����ַ�ʽ����Ȼ������֮�ؿ��ǵ��������.

���һ�������@var{components}Ϊ��,����ζ��@var{result}����ƥ����ַ���.
����,�����һ����һ���ɶ��ŷָ���0������@code{exp}��:

@example
@group
expseq:   /* empty */ /* �� */
        | expseq1
        ;
@end group

@group
expseq1:  exp
        | expseq1 ',' exp
        ;
@end group
@end example

@noindent
����ͨ����ÿ��û�в����Ĺ������һ��@samp{/* empty */}��ע��.

@node Recursion
@section �ݹ����-Recursive Rules
@cindex �ݹ����(recursive rule)

һ�����򱻳�Ϊ@dfn{�ݹ��(recursive})������@var{result}���ս��Ҳ�������������ֱ�.
��Ϊ���ַ�����Ψһ���Զ���һ���ض�����������������еķ���,
�������е�Bison�﷨����Ҫʹ�õݹ�.
����������ŷָ���һ�����߶������ʽ�ĵݹ鶨��:

@example
@group
expseq1:  exp
        | expseq1 ',' exp
        ;
@end group
@end example

@cindex ��ݹ�(left recursion)
@cindex �ҵݹ�(right recursion)
@noindent
����@code{expseq1}�ĵݹ�ʹ���������ֶ˵��������,
���ǳ����ֵݹ�Ϊ@dfn{��ݹ�(left recursion)}.
�෴��,������һ����ͬ��ʹ��@dfn{�ҵݹ�(right recursion)}�Ķ���.

@example
@group
expseq1:  exp
        | exp ',' expseq1
        ;
@end group
@end example

@noindent
�������ж�����ʹ�����ݹ�����ҵݹ鶨��,
����ͨ����Ӧ��ʹ����ݹ�,
��Ϊ������ʹ�ÿռ�̶���ջ���������������Ԫ������.
���ڼ�ʹ����ֻӦ��һ��,����֮ǰ,����Ԫ��Ҳ�����뱻�ƽ���ջ��,
�ҵݹ�ʹ�õ�Bisonջ�ռ��������е�Ԫ�ظ���������.
@xref{Algorithm, ,Bison�������㷨-The Bison Parser Alogorithm}.����ⷽ����������.

@cindex �໥�ݹ�-mutual recursion
@dfn{���(Indirect)}����@dfn{�໥(mutual)}�ݹ鵱����Ľ��û�����������ֶ˳���
���ǳ������������ֶ˵ķ��ս����������ֶ�ʱ����.

����:

@example
@group
expr:     primary
        | primary '+' primary
        ;
@end group

@group
primary:  constant
        | '(' expr ')'
        ;
@end group
@end example

@noindent
�����������໥�ݹ�ķ��ս��,��Ϊ���ǻ�������.

@node Semantics
@section �������Ե�����-Defining Language Semantics
@cindex �������Ե�����(defining language semantics)
@cindex ���Ե�����(language semantics), ����(defining)

���Ե��﷨����֮���������Ե��﷨.
����ֵȴ��������ּǺź��������������ֵ�͵������鱻ʶ��ʱִ�еĶ���������.

����,�������ڶ�ÿ������ʽ��������ȷ����ֵ,�������ſ�����ȷ�ļ���.
��Ϊ��@w{@samp{@var{x} + @var{y}}}�Ķ����ǽ�@var{x}��@var{y}�������ֵ���,
���Լ���������ȷ�ؼ���ӷ�

@menu
* ֵ����(Value Type):Value Type.        Ϊ���е�����ֵָ��һ������.
* ��������(Multiple Types):Multiple Types.    ָ�����ֿ�ѡ����������.
* ����(Actions):Actions.           ������һ���﷨��������嶨��.
* ��������(Action Types):Action Types.      Ϊ����ָ��һ��Ҫ��������������.
* �����м�Ķ���(Mid-Rule Actions):Mid-Rule Actions.  ���������ڹ���֮��,
                                           ��һ�ڽ���ʲôʱ���Լ�ΪʲôҪʹ�ù����м䶯��������.
@end menu

@node Value Type
@subsection ����ֵ����������-Data Types of Semantic Values
@cindex ����ֵ����(semantic value type)
@cindex ֵ����(value type), ����(semantic)
@cindex ����ֵ����������(data types of semantic values)
@cindex Ĭ����������(default data type)

��һ���򵥵ĳ�����,�����е����Խṹ������ֵʹ��ͬһ���������;��㹻����.
��@acronym{RPN}����׺�������������е�ȷ������.(@pxref{RPN Calc, ,�沨���Ǻż�����-Reverse Polish 
Notation Calculator}).

BisonĬ���Ƕ�����������ֵʹ��@code{int}����.
���Ҫָ������������,������������@code{YYSTYPE}�����һ����:

@example
#define YYSTYPE double
@end example

@noindent
����궨��������﷨�ļ���@var{Prologue}����.
(@pxref{Grammar Outline, ,Bison�﷨���-Outline of a Bison Grammar})

@node Multiple Types
@subsection ����ֵ����-More Than One Value Type

�ڴ����������,����Ҫ�Բ�ͬ����ļǺź���ʹ�ò�ͬ����������.
����,һ�����ֳ���������Ҫ����@code{int}��@code{long int},
��һ���ַ�������������Ҫ����@code{char *},
����һ����ʶ����Ҫһ��ָ����ű����ָ����Ϊ������ֵ������.

Ϊ����һ����������ʹ�ö�������ֵ����,
BisonҪ��������������:

@itemize @bullet
@item
ʹ��Bison����@code{%union}ָ��ȫ�����ܵ��������ͼ�.
(@pxref{Union Decl, ,ֵ���ͼ�-The Collections of Value Types}).

@item
����Щ������Ϊÿ������(�ս�����߷��ս��)ѡ��һ����Ϊ������ֵ����.
Ҫ������Щ,���ԶԼǺ�ʹ��Bison����@code{%token}(@pxref{Token Decl, ,�������͵�����-Token Type Names});
���Ҷ���ʹ��Bison����@code{%type}(@pxref{Type Decl, ,���ս��-Nonterminal Symbols})
@end itemize

@node Actions
@subsection ����-Actions
@cindex ����(action)
@vindex $$
@vindex $@var{n}

��һ�������ʵ����ʶ���ʱ��,
ͬ�����������İ���C����Ķ����ᱻִ��.
����������������ӼǺŵ�����ֵ���߸�С�������ֵ���������������ֵ.

һ�������ɰ����ڴ�����֮�ڵļ���C��乹��,����һ��C����.
һ���������԰�������������C���.
Ȼ��,Bison�����������ַ���(trigraphs),
���������Ĵ�����ʹ�������ַ���,��Ҫ��֤����Ӱ��Ƕ�׵����Ż���ע�͵ı߽�,�ַ����򵥸��ַ�.

һ���������԰����ڹ�������ⲿ��;
�������Ǹ�λ��ִ��.
������������һ���ڹ������в������Ķ���.
�ڹ���֮�еĶ����Ǹ��м����ԵĲ��ҽ����������Ŀ��
(@pxref{Mid-Rule Actions, ,�ڹ����м�Ķ���-Actions in Mid-Rule}).

�����е�C�������ʹ�ýṹ@code{$@var{n}}������ƥ�����Ĳ���������ֵ.
����ṹ�����˵�@var{n}��������ֵ.
���ڱ��������������ֵΪ@code{$$}.
����Щ�����Ƶ��������ļ���ʱ��,Bison������Щ�ṹ������ʵ����͵ı���ʽ.
@code{$$}�������һ�������޸ĵ���ֵ�Ա���Զ�����ֵ.

������һ�����͵�����:

@example
@group
exp:    @dots{}
        | exp '+' exp
            @{ $$ = $1 + $3; @}
@end group
@end example

@noindent
�������������ɼӺ����ӵ���С��@code{exp}�鹹��һ��@code{exp}.
�����������,@code{$1}��@code{$3}������������@code{exp}�������ֵ.
�����ǹ������ֶ˵�һ���͵���������.
�ͱ��洢��@code{$$}�Ա��Ϊ�ոձ�����ʶ��ļӷ�����ʽ������ֵ.
���@samp{+}�Ǻ���һ�����õ�����ֵ,����ͨ��@code{$2}������.

ע�⵽��ֱ���ַ�@samp{|}��ȷ��һ���ָ���,
���Ҷ���ֻ�����ӵ�һ����һ�Ĺ�����.
����һ���Flex���߲�ͬ�ĵط�.
��Flex��,@samp{|}�ȴ���``����''Ҳ�ܴ���``����һ������������ͬ�Ķ���''.
�������������,��������@samp{b}�����ֵ�ʱ�򴥷�.

@example
@group
a-or-b: 'a'|'b'   @{ a_or_b_found = 1; @};
@end group
@end example

@cindex Ĭ�϶���(default action)
����㲢û��ָ��һ������Ķ���,Bison�ṩ��Ĭ�ϵĶ���:
@w{@code{$$ = $1}.} ���,��һ�����ŵ�ֵ��������������ֵ.
��Ȼ,�������ǵ�����������ͬʱ,Ĭ�϶���������Ч��.
����һ���չ���,��û���������Ĭ�϶���;
������������ֵ�޹ؽ�Ҫ,����ÿ���չ����������ȷ�Ķ���.

��@code{$@var{n}}��@var{n}��ʹ��0��ֵ��������.
��ʹ����������ƥ�䵱ǰ����@emph{֮ǰ}��ջ�мǺŻ���.
����һ��ʮ��ð�յĳ���.
�������ȷ��ǰӦ�õĹ����ڵ������Ĳ��ܿɿ���ʹ����.
������һ���ɿ���ʹ�����ַ���������:

@example
@group
foo:      expr bar '+' expr  @{ @dots{} @}
        | expr bar '-' expr  @{ @dots{} @}
        ;
@end group

@group
bar:      /* empty */
        @{ previous_expr = $0; @}
        ;
@end group
@end example

ֻҪ@code{bar}����������չʾ����ʽʹ��,
@code{$0}������������ǰ��@code{bar}��@code{foo}�Ķ����е�@code{expr}.

@node Action Types
@subsection ������ֵ����������-Data Types of Values in Actions
@cindex ������������(action data types)
@cindex �����е���������(data types in actions)

�����Ϊ����ֵֻѡ����һ����������,
��ô@code{$$}��@code{$@var{n}}�ṹ������������.

������Ѿ�ʹ����@code{%union}ָ���˶�����������,
��ô��������Щ������Ϊÿһ������������ֵ���ս������ս������һ��.
֮����ÿ��ʹ��@code{$$}����@code{$@var{n}}��ʱʱ��,
�������������������õķ��ŵ����;���.
�����������:

@example
@group
exp:    @dots{}
        | exp '+' exp
            @{ $$ = $1 + $3; @}
@end group
@end example

@noindent
@code{$1}��@code{$3}������@code{exp}��ʵ��,
�������Ƕ���Ϊ���ս��@code{exp}��������������.
���ʹ����@code{$2},���ͻ�ӵ��Ϊ�ս��@code{'+'}������������,
������������ʲô.

����,����������ֵ��ʱ��,
�����õĿ�ʼ@samp{$}֮�����@samp{<@var{type}>},
�㻹����ָ����������,
����,������Ѿ�����������չʾ����������:

@example
@group
%union @{
  int itype;
  double dtype;
@}
@end group
@end example

@noindent
��ô�������@code{$<itype>1}��Ϊһ�����������ù���ĵ�һ���ӵ�Ԫ,
������@code{$<dtype>1}��Ϊһ��˫������������.

@node Mid-Rule Actions
@subsection �����еĶ���-Actions in Mid-Rule
@cindex �ڹ����еĶ���(actions in mid-rule)
@cindex �����ж���(mid-rule actions)

ż����,��һ�������ŵ�����֮���Ǻ����ô���.
��Щ�����д����ͬ�ڹ���֮��Ķ���һ��,
��������ȴ�ڷ�����ʶ��֮��Ĳ���֮ǰִ��.

һ�������ж�������ͨ��@code{$@var{n}}����������֮ǰ�Ĳ���,
���ǲ������ý������Ĳ���,��Ϊ������������Ǳ�����֮ǰִ��.

�����еĶ����Լ�Ҳ��Ϊ��������һ������.
������ͬһ���������һ��������Щ��ͬ(��һ������ͨ���ڽ�β):
����@code{$@var{n}}ʹ�����@var{n}��ʱ��,
��������������ͷ���һ��Ҳ��������.

�����еĶ���Ҳ����ӵ������ֵ.
�����������ͨ����@code{$$}��������������ֵ,
���ҹ���֮�еĺ�һ��������Ӧʹ��@code{$@var{n}}�������ֵ.
����û�з��ſ��������������,
����û�а취Ϊ���ֵ��������һ����������.
ÿ�����������ֵ��ʱ��
�����ʹ��@samp{$<@dots{}>@var{n}}�ṹ��ָ��һ����������.

û�а취�ڹ����ж�����Ϊ���������趨һ��ֵ,
��Ϊ��@code{$$}�ĸ�ֵ��û���Ǹ�Ч��(ע:����һ��).
Ϊ��������ֵ��Ψһ������ͨ������ĩβ����ͨ����ʵ��.

������һ�����Լ��������������,���ڴ���@code{let}���.
��ʽΪ@samp{let (@var{variable}) @var{statement}}
����@var{statement}�����ڴ���һ����Ϊ@var{variable}����ʱ����.
Ϊ�˷�������ṹ,
��@var{statement}��������ʱ��,���Ǳ��뽫@var{varible}������ű�,
�����Ժ��Ƴ���.
��������������ι�����:

@example
@group
stmt:   LET '(' var ')'
                @{ $<context>$ = push_context ();
                  declare_variable ($3); @}
        stmt    @{ $$ = $6;
                  pop_context ($<context>5); @}
@end group
@end example

@noindent
һ��@samp{let (@var{variable})}�Ѿ���ʶ��,��һ��������ִ��.
��ʹ�����������������е�@code{context},
��������һ����ǰ����������(�ɷ��ʱ����б�)�ĸ�����Ϊ��������ֵ.
Ȼ�����@code{declare_variable}�����Ǹ��б������µı���.
һ����һ������ִ�����,
Ƕ������@code{stmt}�Ϳ��Ա�������.
ע�⵽�����ж����ı����5,����@samp{stmt}�ı��Ϊ6.

��Ƕ������@code{stmt}������֮��,��������ֵ�߱�Ϊ������@code{let}-����ֵ.(ע:@code{$$=$6;})
֮��,ǰһ������������ֵ(ע@code{$<context>5})�������洢��ǰ�ı����б�.(ע:@code{pop_context ($<context>5)})
�⽫��ʱ��@code{let}-�������б���ɾ��.
��������Ŀ���������������ڷ�����������ಿ�ֵ�ʱ��.

���ڷ�����Ϊ��ִ�ж���������ǿ�Ʒ���,
��һ������û����ȫ��ʶ��֮ǰִ�ж��������ᵼ�³�ͻ.
����,���µ���������,��û�й����еĶ���,�����ڷ������й���.
��Ϊ�����������ƽ�һ���������
���Ҳ鿴֮�����ķ�����ȷ�����Ƿ���һ������.

@example
@group
compound: '@{' declarations statements '@}'
        | '@{' statements '@}'
        ;
@end group
@end example

@noindent
���ǵ�������������������һ�������еĶ���ʱ,�����ʧЧ��:

@example
@group
compound: @{ prepare_for_local_variables (); @}
          '@{' declarations statements '@}'
@end group
@group
        | '@{' statements '@}'
        ;
@end group
@end example

@noindent
����,����������û�ж��������ŵ�ʱ��,���ͱ��Ⱦ����Ƿ�ִ�й����еĶ���.
���仰˵,��������û���㹻����Ϣ������ȷѡ���ʱ��,
���ͻ�ǿ��ʹ��һ�����������Ĺ���.
(���ʱ�����ڷ��������ھ�����ô��,
������żǺű���֮Ϊ@dfn{��ǰɨ��Ǻ�(look-ahead)}.
@xref{Look-Ahead, ,��ǰɨ��Ǻ�-Look-Ahead Token}.)
(ע:���ʱ����������ĳ�ǰɨ��ǺŶ���@samp{@{})

�������Ϊ�����������������ͬ�Ķ������Խ���������,��������:

@example
@group
compound: @{ prepare_for_local_variables (); @}
          '@{' declarations statements '@}'
        | @{ prepare_for_local_variables (); @}
          '@{' statements '@}'
        ;
@end group
@end example

@noindent
�������ַ���������,��ΪBison��û����ʶ��������������ȫ��ͬ��.
(Bison��Զ���᳢�����⶯���е�C����.)

����﷨��������:����������һ���Ǻ�(C���Ծ�������)ʶ���һ������.
��ô�������ŵ�������ź���һ�����еĽ������.
��������:

@example
@group
compound: '@{' @{ prepare_for_local_variables (); @}
          declarations statements '@}'
        | '@{' statements '@}'
        ;
@end group
@end example

@noindent
���ڽ������������������ĵ�һ���Ǻ�(ע:��ǰɨ��Ǻ�)
���κ�����¶����֪Bison��ʹ����һ������.

����һ�ֽ�������ǽ���������һ����Ϊ�ӹ���ķ��ս��.

@example
@group
subroutine: /* empty */
          @{ prepare_for_local_variables (); @}
        ;

@end group

@group
compound: subroutine
          '@{' declarations statements '@}'
        | subroutine
          '@{' statements '@}'
        ;
@end group
@end example

@noindent
����Bison����ȴȷ������ʹ�õĹ���Ϳ�ִ�й���@code{subroutine}�еĶ���.
ע�⵽:���ڶ����Ѿ��ڹ���Ľ�β.
�κι����м�Ķ��������������ַ���ת��Ϊһ�������β�Ķ���,
������Ҳ��Bison���������м�Ķ����ķ���.

@node Locations
@section ׷��λ��-Tracking Locations
@cindex λ��(location)
@cindex ����λ��(textual location)
@cindex λ��(location), ���ֵ�(textual)

��Ȼ�﷨���������ֵ���ڱ�д�������Ƶķ�������˵�㹻����,
���Ǵ���һЩ�������Ϣ�ر��Ƿ���λ�õ���ϢҲ�Ƿǳ����õ�.

����λ�õķ�����һ���������ͺ͹���ƥ��ʱִ�еĶ��������.

@menu
* λ������:Location Type.               ����λ�õ���������.
* ������λ��:Actions and Locations.       �ڶ�����ʹ��λ��.
* λ�õ�Ĭ�϶���:Location Default Action.     ������һ������λ�õ�ͨ�÷���.
@end menu

@node Location Type
@subsection λ�õ���������-Data Type of Locations
@cindex λ�õ���������(data type of locations)
@cindex Ĭ��λ������(default location type)

�������еļǺź�������ʹ����ͬ������,
����һ��λ�õ���������Ҫ�ȶ�������ֵ�ļ򵥵Ķ�.

λ�õ�������һ����Ϊ@code{YYLTYPE}�ĺ궨��.
��@code{YYLTYPE}û�б������ʱ��,
Bisonʹ�ú����ĸ���Ա�Ľṹ����ΪĬ�ϵĶ���:

@example
typedef struct YYLTYPE
@{
  int first_line;    /* ��һ��   */
  int first_column;  /* ��һ��   */
  int last_line;     /* ���һ�� */
  int last_column;   /* ���һ�� */
@} YYLTYPE;
@end example

@node Actions and Locations
@subsection ������λ��-Actions and Locations
@cindex λ�ö���(location actions)
@cindex ����(actions), λ��(location)
@vindex @@$
@vindex @@@var{n}

������������Ϊ�˶������Ե�����,
��������ʹ��λ����������ķ���������Ϊ.

�����Ե�Ϊ�﷨�齨��λ�õķ������������ֵ�ķ�������.
��һ�������Ĺ�����,
���ֽṹ�������ڷ��ʱ�ƥ��Ԫ�ص�λ��.
���ֶ˵�@var{n}��������λ����@code{@@@var{n}}
����ߵ����λ����@code{@@$}.

����һ��������ʹ��λ�õ�Ĭ���������͵�����:

@example
@group
exp:    @dots{}
        | exp '/' exp
            @{
              @@$.first_column = @@1.first_column;
              @@$.first_line = @@1.first_line;
              @@$.last_column = @@3.last_column;ip
              @@$.last_line = @@3.last_line;
              if ($3)
                $$ = $1 / $3;
              else
                @{
                  $$ = 1;
                  fprintf (stderr,
                           "Division by zero, l%d,c%d-l%d,c%d",
                           @@3.first_line, @@3.first_column,
                           @@3.last_line, @@3.last_column);
                @}
            @}
@end group
@end example

���������ֵһ��,��һ��ÿ������ƥ��ʱ��λ�õ�Ĭ�϶���.
����@code{@@$}�Ŀ�ʼ����Ϊ��һ�����ŵĿ�ʼ����@code{@@$}��ĩβ��Ϊ���һ�����ŵ�ĩβ.

����ͨ��ʹ�����Ĭ�ϵĶ�����ʵ��λ��׷�ٵ�ȫ�Զ�.
��������ӿ��Լ򵥵�������д:

@example
@group
exp:    @dots{}
        | exp '/' exp
            @{
              if ($3)
                $$ = $1 / $3;
              else
                @{
                  $$ = 1;
                  fprintf (stderr,
                           "Division by zero, l%d,c%d-l%d,c%d",
                           @@3.first_line, @@3.first_column,
                           @@3.last_line, @@3.last_column);
                @}
            @}
@end group
@end example

@node Location Default Action
@subsection λ�õ�Ĭ�϶���-Default Action for Locations
@vindex YYLLOC_DEFAULT

ʵ����,���������Ǽ���λ�õ���õط�.
����λ�ñ�����ֵ���ձ�,
����������ķ��������������ض���ÿ�������Ĭ�϶���(ע:��λ�õ�)�Ŀռ�.
@code{YYLLOC_DEFAULT}��ÿ��һ������ƥ��������Ķ�����δִ��֮ǰ������.
������һ���﷨����Ҫ��������λ�õ�ʱ��,��Ҳ�ᱻ����.

�����ʱ��,
���������ʤ�����嶯����רע��λ�õĴ���.

@code{YYLOC_DEFAULT}�������������.
��һ������(������)��λ��.
��ƥ��һ������ʱ,
�ڶ���������ʶ������ƥ��Ĺ���������Ҷ�Ԫ�ص�λ��,
�����������ǹ����Ҷ�Ԫ�صĴ�С;
������һ���﷨�����ʱ��,
�ڶ���������ʶ���ڴ������ж����ķ��ŵ�λ��,
�����������Ƕ������ŵ�����.

@code{YYLOC_DEFAULT}Ĭ�ϵر���������:

@smallexample
@group
# define YYLLOC_DEFAULT(Current, Rhs, N)                                \
    do                                                                  \
      if (N)                                                            \
        @{                                                               \
          (Current).first_line   = YYRHSLOC(Rhs, 1).first_line;         \
          (Current).first_column = YYRHSLOC(Rhs, 1).first_column;       \
          (Current).last_line    = YYRHSLOC(Rhs, N).last_line;          \
          (Current).last_column  = YYRHSLOC(Rhs, N).last_column;        \
        @}                                                               \
      else                                                              \
        @{                                                               \
          (Current).first_line   = (Current).last_line   =              \
            YYRHSLOC(Rhs, 0).last_line;                                 \
          (Current).first_column = (Current).last_column =              \
            YYRHSLOC(Rhs, 0).last_column;                               \
        @}                                                               \
    while (0)
@end group
@end smallexample

��@var{k}��������ʱ��,
����@code{YYRHSLOC (rhs,k)}���ص��ǵ�@var{k}�����ŵ�λ��.
��@var{k}��λ��@var{n}��Ϊ���ʱ��,
@code{YYRHSLOC(rhs,k)}���ص��Ǹոձ���Լ�ķ��ŵ�λ��.

��Ҫ�Լ������@code{YYLLOC_DEFAULT}��ʱ��,��Ҫ�������¼���:

@itemize @bullet
@item
@c bad translated
���еĲ���Ӧ�ò������/�Ҷ˵�����.
Ȼ��,ֻ�е�һ��(���)Ӧ�ñ�@code{YYLOC_DEFAULT}�޸�.

@item
���������嶯��һ���ԵĿ���,
���ֶ���Ч�����ķ�ΧӦ���Ǵ�1��@var{n}.
��@var{n}��0��ʱ��,ֻ��0����Ч�������������õ��ǹ�Լǰ���Ǹ�����.
�ڴ�������,@var{n}��������.

@item
��Ϊʵ�ʵĲ������ܲ���������,
�����Ҫ�Ļ�,��Ӧ�üӲ�������������.
ͬ����,����ĺ�����һ���ֺ�ʱ,
��Ӧ�ñ�չ���ɿ���Ϊ�������ʹ�õĶ���.


@end itemize

@node Declarations
@section Bison����-Bison Declarations
@cindex ����(declarations), Bison
@cindex Bison����(Bison declarations)

@dfn{Bison����(Bison declarations)}���ֶ��������������﷨�ķ��ź�����ֵ����������.
@xref{Symbols, ,����-Symbols}.

���з�����������(��������@code{'+'}��@code{'*'}�ĵ��ַ��Ǻ�)���뱻����.
�����Ҫָ�����ս������ֵ���������͵Ļ�,��ô����Ҳ���뱻����
(@pxref{Multiple Types, ,����ֵ����-More Than One Value Type}).

Ĭ�ϵ�,�ļ��ĵ�һ������Ҳָ���˿�ʼ����.
�����Ҫ�����ķ�����Ϊ��ʼ����,�������ʾ��ʽ��������.
(@pxref{Language and Grammar, ,�������������޹��ķ�-Language and Context-Free Grammars})

@menu
* ��������(Token Decl):Token Decl.        �����ս��
* ���ȼ�����(Precedence Decl):Precedence Decl.   �����ս�������ȼ��ͽ����
* ����������(Union Decl):Union Decl.        ����һ������ֵ����
* ��������(Type Decl):Type Decl.         �������ս�����ֵ������
* ��ʼ��������(Initial Action Decl):Initial Action Decl.  �ڷ�����ʼǰִ�еĴ���
* ��������(Destructor Decl):Destructor Decl.   ��������ͷŷ���
* ��������(Expect Decl):Expect Decl.       ����������ͻʱ�ľ���
* ��ʼ��������(Start Decl):Start Decl.        ָ����ʼ����
* ������������(Pure Decl):Pure Decl.         ����һ��������ķ�����
* �������ܽ�(Decl Summary):Decl Summary.      һ������Bison�������ܽ�
@end menu

@node Token Decl
@subsection ������������-Token Type Names
@cindex ����������������(declaring token type names)
@cindex ������������(token type names), ����(declaring)
@cindex �������ִ��Ǻ�(declaring literal string tokens)
@findex %token

������������(�ս��)��������ķ�������:

@example
%token @var{name}
@end example

Bison���ڷ������н��������ת����@code{#define}ָ��
�Ա�@code{yylex}(���������ļ���ʹ������)
������������@var{name}��������Ǻ�������.

����,�����Ҫָ������Ժ����ȼ�,
�����ʹ��@code{%left},@code{%right}����@code{%nonassoc}
����@code{%token}.
@xref{Precedence Decl, ,���������ȼ�-Operator Precedence}.

�������������һ��ʮ���ƻ�ʮ���������������żǺ���������ʽ��ָ��
һ���������͵�������.

@example
%token NUM 300
%token XNUM 0x12d // a GNU extension һ��GNU��չ
@end example

@noindent
Ȼ��,����ͨ�������Bisonѡ�����мǺ����͵�������.
Bison���Զ���ѡ�񻥲���ͻ���������ַ���ͻ����.

��ջ������һ���������ʱ��,
�����ʹ��@code{%token}���������Ǻ�������ָ���Ǻŵ�����ֵ����.
����ֵ�����������ŷָ�.
(@pxref{Multiple Types, ,����ֵ����-More Than One Value Type}).

����:

@example
@group
%union @{              /* define stack type */ /* ����ջ���� */
  double val;
  symrec *tptr;
@}
%token <val> NUM      /* define token NUM and its type */ /* ����һ���Ǻ�NUM�������������� */
@end group
@end example

�����ִ�д��@code{%token}�����Ľ�β,
����԰�һ�������������ƹ��������ִ��Ǻ���.
����:

@example
%token arrow "=>"
@end example

@noindent
����,һ��C�����﷨������ͬ�ȵ����ִ��Ǻ�ָ����Щ����

@example
%token  <operator>  OR      "||"
%token  <operator>  LE 134  "<="
%left  OR  "<="
@end example

@noindent
һ����ʹ���ִ��ͷ������Ƶȼ�,
��������Ժ�����������﷨�����н����ʹ������.
@code{yylex}��������ʹ�÷������ƻ������ִ�����÷�������������.
(@pxref{Calling Convention, ,���ù���-Calling Convention}).

@node Precedence Decl
@subsection ���������ȼ�-Operator Precedence
@cindex ���ȼ�����(precedence declarations)
@cindex �������������ȼ�(declaring operator precedence)
@cindex ���������ȼ�(operator precedence), ����(declaring)

ʹ��@code{%left},@code{%right}����@code{%nonassoc}
����һ������һ���ǺŲ�ָ���������ȼ��ͽ����.
��Щ������@dfn{���ȼ�����(precedence declarations)}.
��ȡ�����ⷽ�����Ϣ,@xref{Precedence, ,���������ȼ�-Operator Precedence}.

���ȼ���������@code{%token}��������ͬ,������

@example
%left @var{symbols}@dots{}
@end example

@noindent
������

@example
%left <@var{type}> @var{symbols}@dots{}
@end example

��Щ��������@code{%token}��Ŀ����ͬ.
���Ƕ����,���ǻ�ָ����@var{symbols}�Ľ���Ժ�������ȼ�:

@itemize @bullet
@item
�������Ľ���Ծ���������ظ�ʹ��Ƕ�׵Ĳ�����:
@samp{@var{x} @var{op} @var{y} @var{op} @var{z}}
�������@var{x}��@var{y},���������@var{y}��@var{z}.
@code{%left}ָ��������(�����@var{x}��@var{y})��
@code{%right}ָ�����н����(�����@var{y}��@var{z}).
@code{%nonassoc}ָ�����޽����,��@samp{@var{x} @var{op} @var{y} @var{op} @var{z}}
����Ϊ��һ���﷨����.

@item
һ�������������ȼ������������������Ĳ�����Ƕ��ʹ��.
��һ�����ȼ����������������мǺ�����ͬ�����ȼ�,
���Ƕ��ʹ������ȡ�������ǵĽ����.
�������Ǻ��ڲ�ͬ�����ȼ�������,����������ӵ�и��ߵ����ȼ�,�����ȱ����.
@end itemize

@node Union Decl
@subsection ֵ���ͼ�-The Collection of Value Types
@cindex ����ֵ����(declaring value types)
@cindex ֵ����(value types), ����(declaring)
@findex %union

@code{%union}����ָ��������ֵȫ�����ܵ��������ͼ�.
�ؼ���@code{%union}�����������C����@code{union}ͬ���Ķ�����һ�Դ�����.

����:

@example
@group
%union @{
  double val;
  symrec *tptr;
@}
@end group
@end example

@noindent
��˵����������ѡ���������@code{double}��@code{symrec*}.
���Ǳ�����������@code{val}��@code{tptr};
��Щ����������@code{%toke}��@code{%type}������Ϊ�ս������ս��ѡ��һ������.
(@pxref{Type Decl, ,���ս��-Nonterminal Symbols}).

��Ϊһ��@acronym{POSIX}��չ,һ����־������������@code{union}��.
����:

@example
@group
%union value @{
  double val;
  symrec *tptr;
@}
@end group
@end example

ָ�����������־@code{value},������Ӧ��C����Ϊ@code{union value}.
����㲻֪��һ����־,��Ĭ�ϵؾ�Ϊ@code{YYSTYPE}.

����Ӧ��ע�⵽,������C�����е�@code{union}����һ��,
��Bison��,�㲻��Ҫ�ڴ����Ž�����ʱ��д�Ϸֺ�.

@node Type Decl
@subsection ���ս��-Nonterminal Symbols
@cindex ����ֵ����(declaring value types), ���ս��(nonterminals)
@cindex ֵ����(value types), ���ս��(nonterminals), ����(declaring)
@findex %type

@noindent
����ʹ��@code{%union}ָ������ֵ���͵�ʱ��,
�����Ϊÿ��Ҫʹ��������ֵ�ķ��ս��ָ��һ��ֵ����.
ͨ��@code{%type}����������һ��,������:

@example
%type <@var{type}> @var{nonterminal}@dots{}
@end example

@noindent
�����@var{nonterminal}�Ƿ��ս��������,
@var{type}����@code{%union}�и�����������ָ���÷��ս��������ֵ����.
(@pxref{Union Decl, ,ֵ���ͼ�-The Collection of Value Types}).
����Ը�����������ķ��ս������ͬ����������,
�����������ͬ��ֵ���͵Ļ�.
��ʱ����Ҫʹ�ÿհ����ָ���������.

��Ҳ��������һ���ս����ֵ����.
Ϊ�ս��ʹ����ͬ��@code{<@var{type}>}�ṹ����������һ��.
��������ļǺ�����������ʹ��@code{<@var{type}>}.

@node Initial Action Decl
@subsection �ڷ���ִ��ǰִ��һЩ����-Performing Actions before Parsing
@findex %initial-action

��Щʱ��,��ķ�������Ҫ�ڷ���֮ǰִ��һЩ��ʼ��.
ͨ��ʹ��@code{%initial-action}ָ��ָ�����ִ���.

@deffn {ָ��} %initial-action @{ @var{code} @}
@findex %initial-action
������@var{code}������ÿ�ε���@code{yyparse}֮ǰ������.
@var{code}����ʹ��@code{$$}��@code{@@$} --- ��ǰɨ��Ǻŵĳ�ʼֵ��λ�� --- ��
@code{%parse-param}.
@end deffn

����,������λ����Ҫʹ��һ���ļ���,�����ʹ��

@example
%parse-param @{ const char *filename @};
%initial-action
@{
  @@$.begin.filename = @@$.end.filename = filename;
@};
@end example


@node Destructor Decl
@subsection �ͷű������ķ���-Freeing Discarded Symbols
@cindex �ͷű������ķ���(freeing discarded symbols)
@findex %destructor

���������ܻᶪ��һЩ����.
@c bad translatd
����,�ڴ���ָ���(@pxref{Error Recovery, ,����ָ�-Error Recovery}),
�����������Ѿ�ѹ��ջ��Ϊ�ѷ���,
�Լ�����ʣ���ļ���Ϊ�ѼǺ�ֱ���������ָ�״̬��
�����Щ���Ŵ��ж���Ϣ,��Щ�ڴ�ͻ���ֶ�ʧ.
@c up
Ȼ��������Ϊ�������������һ�������������ǿ������̵�,
���������ڿ���``û���յ�''�ķ�������shells����ͨ��Э���ʵ��.

@code{%destructor}ָ���������嵱һ�����ű�����ʱ���õĴ���.

@deffn {ָ��} %destructor @{ @var{code} @} @var{symbols}
@findex %destructor
������@var{code}������ÿ�η���������@var{symbols}ʱ����.
@var{code}Ӧ��ʹ��@code{$$}��ָ����@var{symbols}����������ֵ.
����ķ���������Ҳ�ǿ��õ�.
(@pxref{Parser Function, ,����������@code{yyparse}-The Parser Funcation @code{yyparse}}).

@strong{����:}���ڰ汾1.875��˵,���������Ȼ��ʵ���Ե�.
��Ҫԭ����û���㹻���û�����.
��Ӧ���﷨�Կ��ܻ�ı�.
@end deffn

���磺

@smallexample
%union
@{
  char *string;
@}
%token <string> STRING
%type  <string> string
%destructor @{ free ($$); @} STRING string
@end smallexample

@noindent
��֤�˵�һ��@code{STRING}����һ��@code{string}��������ʱ,
��ص��ڴ�Ҳ�ᱻ�ͷ�.

@c not yet understanded
ע�⵽�ڽ���,Bison����Ϊ�ڶ�����û���ἰ���Ҷ˳�ԱҲ���Ա�����.
����,��:

@smallexample
comment: "/*" STRING "*/";
@end smallexample

@noindent
��������Ȩ����@code{string}������ֵ.
��Ȼ,�ⲻ������Ĭ�϶���:
�Ƚ�:

@smallexample
typeless: string;  // $$ = $1 does not apply; $1 is destroyed.
typefull: string;  // $$ = $1 applies, $1 is not destroyed.
@end smallexample
@c up

@sp 1

@cindex �������ķ���(discarded symbols)
@dfn{�������ķ���(Discarded symbols)} �����¼���:

@itemize
@item
�ڵ�һ�׶εĴ���ָ���ջ��������.
@item
�ڵڶ��׶δ���ָ���Ҫ������ս��.
@item
���������쳣��ֹʱ(����ͨ����ʽ�ص���@code{YYABORT},����һϵ��ʧ�ܵĴ���ָ�),
��ǰ�ĳ�ǰɨ��Ǻ�.

@end itemize


@node Expect Decl
@subsection ������ͻ����-Suppressing Conflict Warnings
@cindex ������ͻ����(suppressing conflict warnings)
@cindex ��ֹ�йس�ͻ�ľ���(preventing warnings about conflicts)
@cindex ����(warnings), ��ֹ(preventing)
@cindex ��ͻ(conflicts), ��������(suppressing warnings of)
@findex %expect
@findex %expect-rr

ͨ�������,�������κεĳ�ͻ��ʱ��,Bison����������
(@pxref{Shift/Reduce, ,�ƽ�/��Լ��ͻ-Shift/Recude Conflicts}),
���Ǵ�����������﷨���е��ǿ���ͨ��Ԥ��ķ���������Һ����������޺����ƽ�/��Լ��ͻ.
���ǳ�ͻ�������ı�,���ǿ�������������Щ��ͻ�ľ���.
�����ʹ��@code{%expect}����������һ��.

����������������:

@example
%expect @var{n}
@end example

�����@var{n}��һ��ʮ��������.
�����������:�����@var{n}���ƽ�/��Լ��ͻ����û�й�Լ/��Լ��ͻ,
Bison��������������.
����и������ٵĳ�ͻ�����й�Լ/��Լ��ͻ,Bison�Ի���������.

����ͨ����@acronym{LALR}(1)������,��Լ/��Լ��ͻ���Ӽ��ֲ���Ӧ����ȫ����.
Bison������Щ�������ܻᱨ���Լ/��Լ��ͻ.
����@acronym{GLR}��������˵,�ƽ�/��Լ��ͻ�͹�Լ/��Լ��ͻ���Ǻ�ƽ�������(����,��û�б�Ҫʹ��@acronym{GLR}����).
���,��@acronym{GLR}��������ʹ����������ָ��һ��Ԥ����Ŀ�Ĺ�Լ/��Լ��ͻҲ�ǿ��Ե�:

@example
%expect-rr @var{n}
@end example

ͨ����˵,ʹ��@code{%expect}��������Щ����:

@itemize @bullet
@item
��ʹ��@code{%expect}��������Ĵ���.
ʹ��@samp{-v}ѡ���ȡ��ͻ�������б�.
BisonҲ���ӡ��ͻ�ĸ���.

@item
���ÿһ����ͻ��ȷ��BisonĬ�ϵĽ����������������Ҫ��.
�������,��д�﷨���ص���ʼ.(ע:��һ��)

@item
����һ��@code{%expect}����,��Bison��ӡ���б�����һ����ͻ����Ŀ.
@end itemize

����,����㲻���ĳ�ͻ����Ŀ,Bison��ֹͣ������.
���������ı����﷨�����˸������ٵĳ�ͻ,
Bison�Իᾯ����.

@node Start Decl
@subsection ��ʼ����-The Start-Symbol
@cindex ������ʼ����(declaring the start symbol)
@cindex ��ʼ����(start symbol), (����)declaring
@cindex Ĭ�Ͽ�ʼ����(default start symbol)
@findex %start

BisonĬ�ϵ���Ϊ���﷨��������ָ���ĵ�һ�����ս��Ϊ�﷨�Ŀ�ʼ����.
����Ա����ʹ�����µ�@code{%start}�������˷����Լ��

@example
%start @var{symbol}
@end example

@node Pure Decl
@subsection ��(������)������-A Pure (Reentrant) Parser
@cindex �����������(reentrant parser)
@cindex ��������(pure parser)
@findex %pure-parser

һ��@dfn{������(reentrant)}��������ִ�й����в�����ĳ���;
���仰˵,��ȫ����@dfn{��(pure)}(ֻ��)���빹��.
�����첽ִ�е�ʱ��,���������Էǳ���Ҫ.
����,��һ��������ò��������������ǲ���ȫ��.
�ڴ��ж��߳̿��Ƶ�ϵͳ��,
һ���ǿ�����������ֻ�ܱ�����(interlocks)����.

ͨ����,Bison���ɲ�������ķ�����.
��Դ��������㹻����,�������ַ������ṩ����Yacc�ļ�����.
(������@code{yylex},@code{yylval}��@code{yyloc}ͨ����ʹ���˾�̬����ı���,
��׼Yacc�����ǲ��������).

��Ϊ����һ��ѡ��,���������һ����,������ķ�����.
Bison����@code{%pure-parse}������Ҫ����һ��������ķ�����.
�������������:

@example
%pure-parser
@end example

�������Ľ����@code{yylval}��@code{yylloc}��ͨ�ű�����Ϊһ��@code{yyparse}�еľֲ�����,
���ҶԴʷ�����������@code{yylex}ʹ���˲�ͬ�ĵ��ù���.
@xref{Pure Calling, ,���������ĵ��ù���-Calling Convention for Pure Parsers}.�Ի�ȡ������Ϣ.
����@code{yynerrs}Ҳ��Ϊ��@code{yyparse}�еľֲ�����
(@pxref{Error Reporting, ,���󱨸溯��@code{yyerror}-The Error Reporting Funcation @code{yyerror}}).
@code{yyparse}�Լ��ĵ��ù�����û�иı�.

�������Ƿ�Ϊ�����������﷨����������.
����Դ��κ���Ч���﷨����һ�������������߲������������.

@node Decl Summary
@subsection Bison�����ܽ�-Bison Declaration Summary
@cindex Bison�����ܽ�(Bison declaration summary)
@cindex �����ܽ�(declaration summary)
@cindex �ܽ�(summary), Bison����(Bison declaration)

����һ�����������﷨���������ܽ�:

@deffn {ָ��} %union
����������ֵ����ӵ�е��������ͼ�.
(@pxref{Union Decl, ,ֵ���ͼ�-The Collection of Value Types}).
@end deffn

@deffn {ָ��} %token
����һ��δָ�����ȼ��ͽ���Ե��ս��(������������)
(@pxref{Token Decl, ,������������-Token Type Names}).
@end deffn

@deffn {ָ��} %right
����һ���ҽ�ϵ��ս��(������������)
(@pxref{Precedence Decl, ,���������ȼ�-Operator Precedence}).
@end deffn

@deffn {ָ��} %left
����һ�����ϵ��ս��(������������)
(@pxref{Precedence Decl, ,���������ȼ�-Operator Precedence}).
@end deffn

@deffn {ָ��} %nonassoc
����һ��û�н���Ե��ս��(������������).
(@pxref{Precedence Decl, ,���������ȼ�-Operator Precedence}).
������Եķ���ʹ������һ���﷨����.
@end deffn

@ifset defaultprec
@deffn {ָ��} %default-prec
Ϊȱ����ʽ@code{%prec}���η��Ĺ���ָ�����ȼ�.
(@pxref{Contextual Precedence, ,�������������ȼ�-Context-Dependent Precedence})
@end deffn
@end ifset

@deffn {ָ��} %type
�������ս��������ֵ����.
(@pxref{Type Decl, ,���ս��-Nonterminal Symbols}).
@end deffn

@deffn {ָ��} %start
ָ�����﷨�Ŀ�ʼ����
(@pxref{Start Decl, ,��ʼ����-The Start-Symbol}).
@end deffn

@deffn {ָ��} %expect
������Ԥ�ڵ��ƽ�/��Լ��ͻ�ĸ���.
(@pxref{Expect Decl, ,������ͻ����-Suppressing Conflict Warnings}).
@end deffn


@sp 1
@noindent
Ϊ�˸ı�@command{bison}����Ϊ,ʹ������ָ��

@deffn {ָ��} %debug
�ڷ������ļ���,���@code{YYDEBUG}δ����,���䶨��Ϊ1,
�Ա��ʽ���Ʊ�����.
@end deffn
@xref{Tracing, ,׷����ķ�����}.

@deffn {ָ��} %defines
��дһ�������Ǻ����Ͷ�������������ĺ궨��ͷ�ļ�.
�������������ļ���@file{@var{name}.c},
��ô���ͷ�ļ�����@file{@var{name}.h}.

����@code{YYSTYPE}�Ѿ����������һ����,
�������ͷ�ļ�������@code{YYSTYPE}.
���,�����ʹ������Ҫ���������@code{%union}����
(@xref{Multiple Types, ,����ֵ����-More Than One Value Type},)
�������Ѿ������˺�@code{YYSTYPE}
(@pxref{Value Type, ,����ֵ����������-Data Types of Semantic Values}),
����Ҫ������Щ����ʹ����������ģ���ǰҳ,
����,�����Ƿ���һ����ķ��������κ�����ģ�鶼������ͷ�ļ���.

������ķ�������һ����������,
���������ͷ�ļ���@code{yylval}����Ϊһ���ⲿ����.
@xref{Pure Decl,һ����(������)������-A Pure (Reentrant) Parser}.

�����Ҳʹ����λ��,
���ͷ�ļ�ʹ��������@code{YYSTYPE}��@code{yylval}���Ƶ�Э������@code{YYLTYPE}��@code{yylloc}.
@xref{Locations, ,׷��λ��-Semantic Values of Tokens}.

�����ϣ����@code{yylex}�Ķ������һ�������Դ�ļ��еĻ�,
��������ͷ�ļ���ͨ�������,
��Ϊ@code{yylex}��Ҫ����ͷ�ļ����ṩ�������ͼǺ�������.
@xref{Token Values, ,�Ǻŵ�����ֵ-Semantic Values of Tokens}.
@end deffn

@deffn {ָ��} %destructor
ָ���˷�������λ���ͬ�����ķ�����������ڴ�.
@xref{Destructor Decl, ,�ͷŶ����ķ���-Freeing Discarded Symbols}.
@end deffn


@deffn {ָ��} %file-prefix="@var{prefix}"
ָ��һ������Bison����ļ���ǰ׺,�ͺ��������ļ���Ϊ@file{@var{prefix}.y}.
@end deffn

@deffn {ָ��} %locations
��������λ�õĴ���(@pxref{Action Features, ,ʹ�ö�������������-Special Features for Use in Actions}).
һ���﷨ʹ����@samp{@@@var{n}}�Ǻ�,����ģʽ�ͻᱻ����.
�����������﷨û���õ���,ʹ��@samp{%locations}���Ի�ø���ȷ���﷨������Ϣ.
@end deffn

@deffn {ָ��} %name-prefix="@var{prefix}"
������������ʹ�õ��ⲿ�����Ա�������@var{prefix}��ʼ,������@samp{yy}.
���ű��������ľ�ȷ�б���:
@code{yyparse}, @code{yylex}, @code{yyerror}, @code{yynerrs},
@code{yylval}, @code{yylloc}, @code{yychar}, @code{yydebug}, �Ϳ���ʹ�õ�
@code{yylloc}.
����, �����ʹ��@samp{%name-prefix="c_"}, ���ƾͻ��Ϊ @code{c_parse}, @code{c_lex}�ȵ�.
@xref{Multiple Parsers, ,ͬһ�������еĶ��������-Multiple Parsers in the Same Program}.
@end deffn

@ifset defaultprec
@deffn {ָ��} %no-default-prec
��ȱ����ʽ��@code{%prec}���η�����ָ�����ȼ�.
(@pxref{Contextual Precedence, ,�������������ȼ�-Context-Dependent Precedence}).
@end deffn
@end ifset

@deffn {ָ��} %no-parser
�ڷ������ļ��в������κ�C����,�������Ʊ���.
�������ļ���������@code{#define}ָ��;�̬��������.

���ѡ��Ҳ����Bison���﷨������C������@code{switch}������ʽ
д��һ����Ϊ@file{@var{filename}.act}���ļ�.
@end deffn

@deffn {ָ��} %no-lines
�ڷ������ļ��в������κ�@code{#line}Ԥ����ָ��.
Bisonͨ������Щָ��д��������ļ��Ա�
C�������͵�ʽ��(debugger)���Խ������Ŀ����������Դ�ļ�(�﷨�ļ�)��������.
���ָ��ʹ���ǹ������󵽷������ļ���������Ϊһ��������Դ�ļ�.
@end deffn

@deffn {ָ��} %output="@var{filename}"
���������ļ�ָ��Ϊ@var{filename}.
@end deffn

@deffn {ָ��} %pure-parser
����һ����(������)����������(@pxref{Pure Decl, ,һ����(������)������-A Pure (Reentrant) Parser}).
@end deffn

@deffn {ָ��} %token-table
�ڷ������ļ�������һ���Ǻ���������.
�����������@code{yytname};
@code{yytname[@var{i}]}��Bison�ڲ�������Ϊ@var{i}�ļǺŵ�����.
ǰ����@code{yytname}��Ԫ����Ԥ����Ǻ�@code{"$end"},@code{"error"},
��@code{"$undefined"}���Ӧ;
���⼸������֮������﷨�ļ��ж���ķ���.

���ڵ��ַ��Ǻź����ִ��Ǻ�,
�����е����ư��������Ż���˫�����ַ�:
����,@code{"'+'"}��һ�����ַ��ǺŶ� @code{"\"<=\""}��һ�����ִ��Ǻ�.
�ַ����Ǻŵ������ַ�һ�ֲ���س����ڷ��ű���;
��ʹ˫�����ַ�Ҳ������.
����,����ǺŰ����������ַ�@samp{*"*},��@code{yytname}���ַ���Ϊ@samp{"*"*"}.
(��C������,��Ӧ��д��@code{"\"*\"*\""}).

����ָ����@code{%token-table},BisonҲ������@code{YYNTOKENS}, @code{YYNNTS}, and
@code{YYNRULES}, ��@code{YYNSTATES}�ĺ궨��:

@table @code
@item YYNTOKENS
��߼Ǻ����ּ�1
@item YYNNTS
���ս��������
@item YYNRULES
�﷨���������
@item YYNSTATES
������״̬������(@pxref{Parser States, ,������״̬-Parser States}).
@end table
@end deffn

@deffn {ָ��} %verbose
��һ�����������ļ�д�����������״̬�Ͷ����Ǹ�״̬��ÿһ�ֳ�ǰɨ��Ǻ�����Щʲô����ϸ����.
@xref{Understanding, ,������ķ�����-Understanding You Parser},�Ի�ȡ������Ϣ.
@end deffn

@deffn {ָ��} %yacc
�ٶ�������@option{--yacc}ѡ��,Ҳ����ģ��Yacc,����������������.
@xref{Bison Options, ,Bisonѡ��-Bison Options},��ø�����Ϣ.
@end deffn


@node Multiple Parsers
@section ��ͬһ��������ʹ�ö��������-Multiple Parsers in the Same Program

���������ʹ��Bison������һ������,��˽�����һ��Bison������.
���������Ҫ�ڳ����з����������Ը���ô��?
�����Ļ�,����Ҫ�����ڲ�ͬ��@code{yyparse},@code{yylval}�ȵ�
��ͬ���������֮��ĳ�ͻ.

Ҫ������һ��,��򵥵ķ�������ʹ��@samp{-p @var{prefix}}ѡ��
(@pxref{Invocation, ,����Bison-Invking Bison}).
���ѡ���������˽ӿں�����Bison����������,
ʹ������@var{prefix}��ͷ������@samp{yy}.
�����ʹ�����ѡ�����ÿ��������������ͻ�Ķ��ص�����.

���������ŵľ�ȷ�б�Ϊ: @code{yyparse}, @code{yylex},
@code{yyerror}, @code{yynerrs}, @code{yylval}, @code{yylloc},
@code{yychar}��@code{yydebug}.
����,�����ʹ����@samp{-p c},
���ƾͱ�Ϊ@code{cparse},@code{clex}�ȵ�.

@strong{����������Bison��صı����ͺ궨�岢û�б�������.}
��Щ�����Ķ���������ȫ�ֵ�;
�����ڲ�ͬ�ķ�������ʹ����ͬ�����Ʋ����������ͻ.
����,@code{YYSTYPE}��δ��������,
�����ڲ�ͬ�ķ��������Բ�ͬ�ķ�ʽ����ͻ�ض���
(@pxref{Value Type, ,����ֵ����������-Data Types of Semantic Values}).

@samp{-p}ѡ���������ļ��Ŀ�ͷ���Ӻ궨��ķ�ʽ����.
����@code{yyparse}Ϊ@code{@var{prefix}parse},�ȵ�.
���ַ�ʽ��Ч���������������ļ����໥�������.

@node Interface
@chapter ������C���Խӿ�-Parser C-Language Interface
@cindex �����Խӿ�(C-language interface)
@cindex �ӿ�(interface)

Bison������ʵ������һ����Ϊ@code{yyparse}��C���Ժ���.
������������һ��@code{yyparse}������Ҫ�õ��ĺ����Ľӿڹ���.

��Ӧ�ü�ס,������ʹ���˺ܶ���@samp{yy}��@samp{YY}��ͷ�ı�ʶ��.
������ڶ�������@var{epilogue}����ʹ��������һ����ʶ��(��������ֲ�֮��),
��ĳ�����ܻ������鷳.

@menu
* ����������(Parser Function):Parser Function.   ��ε���@code{yyparse}�Լ����ķ���ֵ.
* �ʷ�(Lexical):Lexical.           ����ṩһ������Ǻŵĺ���@code{yylex}.
* ���󱨸�(Error Reporting):Error Reporting.   ������ṩһ������@code{yyerror}.
* ��������(Action Feature):Action Features.   �ڶ�����ʹ�õ���������.
@end menu

@node Parser Function
@section ����������@code{yyparse}-The Parser Function @code{yyparse}
@findex yyparse

��ͨ�����ú���@code{yyparse}��ʼ���з���.
�����������Ǻ�,ִ�ж���,
��������������������������߲��ָܻ��Ĵ���ͻ᷵��.
��Ҳ���Ա�дһ����@code{yyparse}�������ز��ٶ���Ķ���.


@deftypefun int yyparse (void)
��������ɹ�,@code{yyparse}����ֵΪ0(���������������ʱ��).

�������ʧ��,����ֵ��Ϊ1.(�������﷨�����ʱ��).
@end deftypefun

�ڶ�����,�����ʹ����Щ��ʹ@code{yyparse}��������:

@defmac YYACCEPT
@findex YYACCEPT
��������0(����������ɹ�).
@end defmac

@defmac YYABORT
@findex YYABORT
��������1(���������ʧ��).
@end defmac

�����ʹ��һ��������ķ�����,
�㻹���ÿ�����ķ�ʽ���������Ͷ������Ϣ.
Ϊ��������һ��,ʹ��@code{%parse-param}����:

@deffn {ָ��} %parse-param @{@var{argument-declaration}@}
@findex %parse-param
������@code{argument-declaration}�����Ĳ���
��һ�������@code{yyparse}����.
@var{argument-declaration}��������������ԭ��ʱʹ��.
@var{argument-declaration}�����һ����ʶ������Ϊ��������.

@end deffn

������һ������.����Щд�������:

@example
%parse-param @{int *nastiness@}
%parse-param @{int *randomness@}
@end example

@noindent
Ȼ�����������÷�����

@example
@{
  int nastiness, randomness;
  @dots{}  /* @r{Store proper data in @code{nastiness} and @code{randomness}.}  */ 
  value = yyparse (&nastiness, &randomness);
  @dots{}
@}
@end example

@noindent
���﷨������,�����������ı���ʽ����������:

@example
exp: @dots{}    @{ @dots{}; *randomness += 1; @dots{} @}
@end example


@node Lexical
@section �ʷ�����������@code{yylex}-The Lexical Analyzer Function @code{yylex}
@findex yylex
@cindex �ʷ�������(lexical analyzer)

@dfn{�ʷ�������(lexical analyzer)}����,@code{yylex},
����������ʶ��ǺŲ������Ƿ��ظ�������(ע:�﷨������).
Bison�����Զ������������;
������д���Ա�@code{yyparse}����.
���������ʱ��Ҳ����Ϊ�ʷ�ɨ����.

�ڼ򵥵ĳ�����,@code{yylex}����������Bison�﷨�ļ���ĩβ.
���@code{yylex}������������ļ���,
����Ҫ���ŷ������ͺ궨���������ǿɼ���.
Ϊ��������һ��,������Bison��ʱ��ʹ��@samp{-d}ѡ���Ա���
����Щ�궨��д�뵽�������Ϊ@file{@var{name}.tab.h}��ͷ�ļ���.
����Խ�����������Ҫ��������Դ�ļ���.
@xref{Invocation, ,����-Bison-Invoking Bison}.

@menu
* ���ù���(Calling Convention):Calling Convention.  @code{yyparse}��ε���@code{yylex}.
* �Ǻ�ֵ(Token Values):Token Values.      @code{yylex}����η������Ѿ�����ļǺŵ�����ֵ.
* �Ǻ�λ��(Token Locations):Token Locations.   ���������Ҫ,@code{yylex}����η��ؼǺŵ�����λ��(�к�,�ȵ�).
* ������(Pure Calling):Pure Calling.      ���������ĵ��ù����кβ�ͬ
                                          (@pxref{Pure Decl, ,һ����(������)������-A Pure (Reentrant) Parser}).
@end menu

@node Calling Convention
@subsection @code{yylex}�ĵ��ù���-Calling Convention for @code{yylex}

@code{yylex}�ķ���ֵ���������ոշ��ֵļǺ����͵���ֵ������;
0��ֵ����������Ľ���.

��һ���Ǻ����﷨��������������������ʱ,
����������﷨�ļ�����һ����,
����궨�����Ǹ��Ǻ����͵�ǡ����������.
����@code{yylex}����ʹ�����������ָ���Ǹ��Ǻ�����.
@xref{Symbols, ,����-Symbols}.

��һ���Ǻ����﷨�ļ�����һ���ַ�����ʱ,
�Ǹ��ַ���������ͬ��Ҳ���Ǹ��Ǻ����͵�������.
����@code{yylex}���Լ򵥵ط����Ǹ��ַ���,
���ҿ���ת��Ϊ@code{unsigned char}�Ա��������չ.
�����ַ����Բ�������ʹ��,
��Ϊ����������Ϊ0,
����ζ������Ľ���.

������һ��չʾ��Щ����������:

@example
int
yylex (void)
@{
  @dots{}
  if (c == EOF)    /* Detect end-of-input.  */ /* ��⵽������� */
    return 0;
  @dots{}
  if (c == '+' || c == '-')
    return c;      /* Assume token type for `+' is '+'.  */ /* �϶�`+'�ļǺ����;���'+' */
  @dots{}
  return INT;      /* Return the type of the token.  */ /* ���ؼǺŵ����� */
  @dots{}
@}
@end example

@noindent
������ֽӿڵ�Ŀ����Ϊ�˿��Բ��Ӹ��ĵ�ʹ��@code{lex}���ߵ����@code{yylex}.

����﷨ʹ�������ִ��Ǻ�,
@code{yylex}�����Ǻ��������ķ���������:

@itemize @bullet
@item
����﷨���������ִ��Ǻŵķ������Ʊ���,
@code{yylex}������������������һ��ʹ����Щ��������.
���������,
�﷨�ļ���ʹ�����ִ��ǺŶ�@code{yylex}û��Ӱ��.


@item
@code{yylex}������@code{yytname}�����ҵ����ַ��Ǻ�.
����Ǻŵ�����������Ǻŵ�������.
���ַ��Ǻŵ�������һ��˫����,�Ǻŵ��ַ�������һ��˫���ż�¼��@code{yytname}��.
�������,�Ǻ�(ע:���ַ��Ǻ�)���ַ�������ת���;
��һ�ֲ���س����ڱ����ַ�����������.

��������@code{yytname}�������ǺŵĴ���.
�������ٶ��Ǻŵ��ַ��洢��@code{token_buffer}��.

@smallexample
for (i = 0; i < YYNTOKENS; i++)
  @{
    if (yytname[i] != 0
        && yytname[i][0] == '"'
        && ! strncmp (yytname[i] + 1, token_buffer,
                      strlen (token_buffer))
        && yytname[i][strlen (token_buffer) + 1] == '"'
        && yytname[i][strlen (token_buffer) + 2] == 0)
      break;
  @}
@end smallexample

@code{yytname}����ֻ����ʹ����@code{%token-table}�����Ż�����.
@xref{Decl Summary, ,�����ܽ�-Decl Summary}.
@end itemize

@node Token Values
@subsection �Ǻŵ�����ֵ-Semantic Values of Tokens

@vindex yylval
��һ����ͨ��(��������)�ķ�������,
�Ǻŵ�����ֵ���뱻�����ȫ�ֱ���@code{yylval}��.
����ֻʹ��һ������ֵ��������ʱ,
@code{yylval}�����Ǹ�����.
���,�������Ϊ@code{int}(Ĭ�ϵ�),
�����������д���@code{yylex}:

@example
@group
  @dots{}
  yylval = value;  /* Put value onto Bison stack.  */ /* ��ֵ����Bisonջ�� */
  return INT;      /* Return the type of the token.  */ /* ���ؼǺ����� */
  @dots{}
@end group
@end example

����ʹ�ö�����������ʱ,
@code{yylval}��������һ����@code{%union}������ɵ�������.
(@pxref{Union Decl, ,ֵ���ͼ�-The Collections of Value Types}).
����,����洢һ���Ǻŵ�����ֵ��ʱ��,
�����ʹ��ǡ�����������Ա.
���@code{%union}������������:

@example
@group
%union @{
  int intval;
  double val;
  symrec *tptr;
@}
@end group
@end example

@noindent
��ô@code{yylex}�еĴ���Ӧ��������:

@example
@group
  @dots{}
  yylval.intval = value; /* Put value onto Bison stack.  */ /* ��ֵ����Bisonջ��. */
  return INT;            /* Return the type of the token.  */ /* ���ؼǺŵ����� */
  @dots{}
@end group
@end example

@node Token Locations
@subsection �Ǻŵ�����λ��-Textual Locations of Tokens

@vindex yylloc
������ڶ�����ʹ����@samp{@@@var{n}}-����(@pxref{Locations, ,
׷��λ��-Tracking Locations})��׷�ټǺź��������λ��,
��ô�������@code{yylex}���ṩ��Щ��Ϣ.
@code{yyparse}Ԥ����ȫ�ֱ���@code{yyloc}���ҵ��ոշ����ļǺŵ�����λ��.
����@code{yylex}�������Ǹ�����������ȷ������.

Ĭ�ϵ�,@code{yyloc}��ֵ��һ���ṹ�岢����ֻ��Ҫ��ʼ����������ʹ�õĳ�Ա.
�ĸ���Ա�ֱ���@code{first_line}, @code{first_column},
@code{last_line}�� @code{last_column}.
ע�⵽:ʹ�����������ʹ�����������������½�.

@tindex YYLTYPE
@code{yyloc}����������Ϊ@code{YYLTYPE}.

@node Pure Calling
@subsection ���������ĵ��ù���-Conventions for Pure Parsers

����ʹ��Bison����@code{%pure-parser}Ҫ��õ�һ����,������ķ�����,
ȫ��ͨ�ű���@code{yylval}��@code{yylloc}���ܼ���ʹ��.
(@xref{Pure Decl, ,һ����(������)������-A Pure (Reentrant Parser}.)
�����ַ�������,����ȫ�ֱ����ɴ��ݸ�@code{yylex}��ָ�����ȡ��.
�������������������,��ͨ����Щָ��洢����������Ǵ���.


@example
int
yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
@{
  @dots{}
  *lvalp = value;  /* Put value onto Bison stack.  */ /* ��ֵ����Bisonջ */
  return INT;      /* Return the type of the token.  */ /* ���ؼǺ����� */
  @dots{}
@}
@end example

����﷨���ļ�û��ʹ��@samp{@@}�ṹ��������λ��,
��ô����@code{YYLTYPE}�Ͳ��ᱻ����.
�����������,ʡ�Եڶ�������;
����һ����������@code{yylex}.

�����ϣ�����ݶ�������ݵ�@code{yylex},
��������@code{%lex-param},����@code{%parse-param}һ�� 
(@pxref{Parser Function, ,����������-Parser Function}).

@deffn {ָ��} lex-param @{@var{argument-declaration}@}
@findex %lex-param
����@code{argument-declaration}��һ�������@code{yylex}����.
@end deffn

����:

@example
%parse-param @{int *nastiness@}
%lex-param   @{int *nastiness@}
%parse-param @{int *randomness@}
@end example

@noindent
���������µĽ��:

@example
int yylex   (int *nastiness);
int yyparse (int *nastiness, int *randomness);
@end example

���������@code{%pure-parser}:

@example
int yylex   (YYSTYPE *lvalp, int *nastiness);
int yyparse (int *nastiness, int *randomness);
@end example

@noindent
���,���@code{%pure-parser}��@code{%locations}����ʹ��:

@example
int yylex   (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness);
int yyparse (int *nastiness, int *randomness);
@end example

@node Error Reporting
@section ���󱨸溯��@code{yyerror}-The Error Reporting Function @code{yyerror}
@cindex ���󱨸溯��(error reporting function)
@findex yyerror
@cindex ��������(parse error)
@cindex �﷨����(syntax error)

Bison��������⵽һ��@dfn{�﷨����(syntax error)}
����һ��@dfn{��������(parse error)}
ÿ����������һ�����������κι���ļǺ�.
һ���﷨����Ҳ����ʹ�ú�@code{YYERROR}��ʽ������һ������
(@pxref{Action Features, ,ʹ�ö�������������-Special Features for Use in Actions}).

Bison����������������һ����Ϊ@code{yyerror}�Ĵ��������溯���������.
����������������ṩ.
ÿ��@code{yyparse}����һ���﷨�����ʱ��,
@code{yyparse}�ͻ������.
@code{yyparse}ֻ����һ������.
����һ���﷨����,
��ʾ���ַ���ͨ����@w{@code{"syntax error"}}.

@findex %error-verbose
�������@var{Bison declarations}����
(@pxref{Bison Declarations, ,@var{Bison Declarations}����-The Bison Declarations Section})
ʹ����@code{%error-verbose}ָ��,
��ôBison���ṩ������ϸ����ȷ�Ĵ�����Ϣ�����ǽ���@w{@code{"syntax error"}}.

������������⵽����һ�ִ���:ջ���.
������������ǳ����ε�Ƕ�׽ṹʱ����.
����������������,
��ΪBison���Զ���ջ������չ��һ���ܴ�ļ���.
��������������,
@code{yyparse}����ͨ���ĸ�ʽ����@code{yyerror}�������ַ���@w{@code{"parser stack overflow"}}.

����Ķ�����ڼ򵥵ĳ����㹻����:

@example
@group
void
yyerror (char const *s)
@{
@end group
@group
  fprintf (stderr, "%s\n", s);
@}
@end group
@end example

��@code{yyerror}���ص�@code{yyparse}��,
��������Ѿ�д����ǡ���Ĵ���ָ��﷨����(@pxref{Error Recovery, ,����ָ�-Error Recovery}),
@code{yyparse}�᳢�Խ��д���ָ�.
����ָ��ǲ����ܵ�,@code{yyparse}����������1.

��Ȼ,�ڴ��д���׷�ٵĴ���������,
@code{yyerror}Ӧ�û���ʵ�ǰ��λ��.
������ʷԭ��,��Щ��ȷ��@acronym{GLR}�����������������Yacc������������.
����,���������@samp{%locations %pure-parser},��ô@code{yyerror}��ԭ����:

@example
void yyerror (char const *msg);                 /* Yacc parsers.  */ /* Yacc ������ */
void yyerror (YYLTYPE *locp, char const *msg);  /* GLR parsers.   */ /* GLR ������ */
@end example

���ʹ����@samp{%parse-param @{int *nastiness@}},��ôԭ����:

@example
void yyerror (int *nastiness, char const *msg);  /* Yacc parsers.  */ /* Yacc ������ */
void yyerror (int *nastiness, char const *msg);  /* GLR parsers.   */ /* GLR ������ */
@end example

����,@acronym{GLR}��Yacc�������Ծ��ԵĴ�������������ͬ��@code{yyerror}���ù���,
����,��@code{yylex}@emph{��}@code{%pure-parse}�ĵ��ù����Ǵ�����,����:

@example
/* Location tracking.  */ /* ׷��λ�� */
%locations
/* Pure yylex.  */ /* ��yylex */
%pure-parser
%lex-param   @{int *nastiness@}
/* Pure yyparse.  */ /* ��yyparse */
%parse-param @{int *nastiness@}
%parse-param @{int *randomness@}
@end example

@noindent
�����������������������������ԭ��:

@example
int yylex (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness);
int yyparse (int *nastiness, int *randomness);
void yyerror (YYLTYPE *locp,
              int *nastiness, int *randomness,
              char const *msg);
@end example

@noindent
ԭ��ֻ������ָ��Bison�����Ĵ������ʹ��@code{yyerror}.
Bison�����Ĵ���ͨ�����Է���ֵ,
����@code{yyerror}���Է����κ�����,
����@code{void}.
����@code{yyerror}������һ����κ���(variadic funcation),
�����Ϊʲô��Ϣ������󴫵ݵ�ԭ��.

@code{yyerror}�ڴ�ͳ�Ϸ���һ�����������Ե�@code{int},
����������ڴ���ʷ��ԭ��.
@code{void}�Ǹ��õ�ѡ��,
��Ϊ������ȷ�ķ�Ӧ��@code{yyerror}�ķ�������.

@vindex yynerrs
����@code{yynerrs}�����˵�Ŀǰλ���������﷨���������.
�������ͨ����ȫ�ֵ�;
���������Ҫ��һ����������(@pxref{Pure Decl, ,һ����(������)������-A Pure (Reentrant) Parser}),
��ô�����������һ��ֻ�ܱ��������ʵľֲ�����.

@node Action Features
@section �ڶ�����ʹ�õ���������-Special Features for Use in Actions
@cindex �ܽ�(summary), ��������(action features)
@cindex ���������ܽ�(action features summary)

�������ڶ�����ʹ�õ�Bison�ṹ,�����ͺ���б�.

@deffn {����} $$
��һ������һ������,��������������ɵ�ǰ���򹹳ɵ��������ֵ.
@xref{Actions, ,����-Actions}.
@end deffn

@deffn {����} $@var{n}
��һ������һ������,������������˵�ǰ������@var{n}������������ֵ.
@xref{Actions, ,����-Actions}.
@end deffn

@deffn {����} $<@var{typealt}>$
����@code{$$}����ָ����@code{%union}�����е�@var{typealt}ѡ��.
@xref{Action Types, ,������ֵ����������-Data Types of Values in Actions}.
@end deffn

@deffn {����} $<@var{typealt}>@var{n}
����@code{$@var{n}}����ָ��@code{%union}�����е�@var{typealt}ѡ��.
@xref{Action Types, ,������ֵ����������-Data Types of Values in Actions}.
@end deffn

@deffn {��} YYABORT;
������@code{yyparse}����,��������ʧ��.
@xref{Parser Function, ,����������@code{yyparse}-The Parser Function @code{yyparse}}.
@end deffn

@deffn {��} YYACCEPT;
������@code{yyparse}����,���������ɹ�.
@xref{Parser Function, ,����������@code{yyparse}-The Parser Function @code{yyparse}}.
@end deffn

@deffn {��} YYBACKUP (@var{token}, @var{value});
@findex YYBACKUP
�Ƴ�һ���Ǻ�.
����������һ��ֻ��Լ��һֵ�Ĺ�����ʹ��,����ֻ��û�г�ǰɨ��Ǻŵ�ʱ������ʹ��.
�����Ҳ��������@acronym{GLR}��������ʹ��.
����꽨��һ����ǰ���мǺ�����@var{token}������ֵ@var{value}�ĳ�ǰɨ��Ǻ�;
Ȼ������Ҫ����������Լ��ֵ.

������������Ч�������ʹ��,
���統�Ѿ����ڳ�ǰɨ��Ǻŵ������ʹ��,
��ô���ᱨ��һ��������Ϣ@samp{cannot back up}���﷨����
����ִ��һ����ͨ�Ĵ���ָ�����.

��������һ�������,���������ಿ�ֲ��ᱻִ��.
@end deffn

@deffn {��} YYEMPTY
@vindex YYEMPTY
��û�г�ǰɨ��Ǻŵ�ʱ��,ֵ�������@code{yychar}��.
@end deffn

@deffn {��} YYERROR;
@findex YYERROR
��������һ���﷨����.
��������������ָ�����������Լ��Ѿ���⵽һ������һ��;
Ȼ��,����������@code{yyerror}���Ҳ���ӡ�κ���Ϣ.
�����Ҫ��ӡһ��������Ϣ,
��@samp{YYERROR;}���֮ǰ��ʽ�ص���@code{yyerror}.
@xref{Error Recovery, ,����ָ�-Error Recovery}.
@end deffn

@deffn {��} YYRECOVERING
�����������﷨�����лָ���ʱ��,�������ʽ��ֵΪ1.
����ʱ��ֵΪ0.
@xref{Error Recovery, ,����ָ�-Error Recovery}.
@end deffn

@deffn {����} yychar
������ǰ��ǰɨ��Ǻŵı���.
(��һ������������,��ʵ������һ��@code{yyparse}�еľֲ�����).
��û�г�ǰɨ��Ǻŵ�ʱ��,��������洢@code{YYEMPTY}��ֵ.
@xref{Look-Ahead, ,��ǰɨ��Ǻ�-Look-Ahead Tokens}.
@end deffn

@deffn {��} yyclearin;
������ǰ�ĳ�ǰɨ��Ǻ�.
����Ҫ���ڴ���ָ�����.
@xref{Error Recovery, ,����ָ�-Error Recovery}.
@end deffn

@deffn {��} yyerrok;
�Ժ������﷨���������ָ�����������Ϣ.
����Ҫ���ڴ���ָ�����.
@xref{Error Recovery, ,����ָ�-Error Recovery}.
@end deffn

@deffn {ֵ} @@$
@findex @@$
��һ����������λ����Ϣ�Ľṹһ������.
���λ�����ɵ�ǰ���򹹳ɵ����λ��.
@xref{Locations, ,׷��λ��-Tracking Locations}.

@c Check if those paragraphs are still useful or not.

@c @example
@c struct @{
@c   int first_line, last_line;
@c   int first_column, last_column;
@c @};
@c @end example

@c Thus, to get the starting line number of the third component, you would
@c use @samp{@@3.first_line}.

@c In order for the members of this structure to contain valid information,
@c you must make @code{yylex} supply this information about each token.
@c If you need only certain members, then @code{yylex} need only fill in
@c those members.

@c The use of this feature makes the parser noticeably slower.
@end deffn

@deffn {ֵ} @@@var{n}
@findex @@@var{n}
��һ����������λ����Ϣ�Ľṹһ������.
���λ�����ɵ�ǰ����ĵ�@var{n}��������λ��.
@xref{Locations, ,׷��λ��-Tracking Locations}.
@end deffn


@node Algorithm
@chapter Bison�������㷨-The Bison Parser Algorithm
@cindex Bison�������㷨(Bison parser algorithm)
@cindex ���������㷨(algorithm of parser)
@cindex �ƽ�(shifting)
@cindex ��Լ(reduction)
@cindex ������ջ(parser stack)
@cindex ջ(stack), ������(parser)

��Bison��ȡ�Ǻŵ�ʱ��,������Щ�Ǻ�ͬ���ǵ�����ֵһ��ѹ��ջ��.
���ջ����Ϊ@dfn{������ջ(parser stack)}.
��һ���Ǻ�ѹ��ջ�ڴ�ͳ�ϱ���Ϊ@dfn{�ƽ�(shifting)}.

����,������׺�������Ѿ���ȡ@samp{1 + 5 *}���ҽ�Ҫ��ȡ@samp{3}.
������ջ��ʱ���ĸ�Ԫ��,ÿ��Ԫ�ض�Ӧһ�����ƽ��ķ���.

�������ջ�������ܺ���ÿ��������Ǻŵ�Ԫ��.
�����@var{n}�����ƽ��ļǺź���ƥ���﷨���򲿼�ʱ,
�������Ǹ��������ǽ������.
�����@dfn{��Լ(reduction)}.
��Щջ�еļǺź��鱻һ����һ����ȡ��.
�Ǹ���ķ������������Ľ��(���ֶ�).
���й���Ķ����Ǵ�����Լ��һ����,
@c bad translation
��Ϊ�����ʲô�ڼ������������ֵ.
@c up

����,�����׺�������ķ�����ջ�������:

@example
1 + 5 * 3
@end example

@noindent
������һ��������һ�����з�,
��ô�������Ԫ�ؿ�ͨ��������򱻹�Լ��15:

@example
expr: expr '*' expr;
@end example

@noindent
��ô���ջ����������Ԫ��:

@example
1 + 15
@end example

@noindent
������ʱ����Խ�������һ�����Ϊ16�Ĺ�Լ.
Ȼ��,���з��ǺŲſ��Ա��ƽ�.

������ͨ���ƽ��͹�Լ���Խ��������뻯Ϊһ������Ϊ�﷨��ʼ���ŵĵ�һ��.
(@pxref{Language and Grammar, ,�������������޹��ķ�-Languages and Context-Free Grammars}).

�������͵ķ���������֮Ϊ@dfn{�Ե�����(bottom-up)}�ķ�����.

@menu
* ��ǰɨ��Ǻ�(Look-Ahead):Look-Ahead.        ��������������ʲô��ʱ�����鿴��һ���Ǻ�.
* �ƽ�/��Լ(Shift/Reduce):Shift/Reduce.      ��ͻ:�ƽ��͹�Լ����Ч.
* ���ȼ�(Precedence):Precedence.        ���ڽ����ͻ�Ĳ��������ȼ�.
* ���������ȼ�(Contextual Precedence):Contextual Precedence.  ��һ�������������ȼ�����������.
* ������״̬(Parser States):Parser States.     ��������һ������ջ������״̬��.
* ��Լ/��Լ(Reduce/Reduce):Reduce/Reduce.     ��ͬһ����¿���Ӧ����������.
* �����Ի�ĳ�ͻ(Mystery Conflicts):Mystery Conflicts.  ��������ƽ�ȵĹ�Լ/��Լ��ͻ.
* ͨ��LR����(Generalized LR Parsing):Generalized LR Parsing.  ������ϵ��������޹��ķ�.
* ջ���(Stack Overflow):Stack Overflow.    ��ջ���ʱ�����������Լ���α�����.
@end menu

@node Look-Ahead
@section ��ǰɨ��Ǻ�-Look-Ahead Tokens
@cindex ��ǰɨ��Ǻ�(look-ahead token)

Bison��������@emph{��}���������@var{n}���Ǻź���ƥ��һ������ʱ�������й�Լ.
�����������ֲ��Զ��ڴ��������������˵�ǲ�����.
�෴,�����Խ���һ����Լ��ʱ��,
��������ʱ``��ǰɨ��''��һ���Ǻ�����������ô��.

����ȡһ���Ǻ�ʱ,
�������Ǳ������ƽ��������ȳ�Ϊ����ջ�е�@dfn{��ǰɨ��Ǻ�(look-ahead token)}.
���ڷ��������ԶԼǺź������һ�������Ĺ�Լ,����ǰɨ��Ǻ�����ջ��.
�Ⲣ����ζ�����п��ܵĹ�Լ�Ѿ�ִ��;
�����ڳ�ǰɨ��Ǻŵķ�������,
һЩ�������ѡ���Ƴ����ǵ�Ӧ��.

������һ����Ҫ��ǰɨ��Ǻŵ�����.
�������������˰��������Ƽӷ���������һԪ��׺�׳Ʋ�����(@samp{!}),
����������������.

@example
@group
expr:     term '+' expr
        | term
        ;
@end group

@group
term:     '(' expr ')'
        | term '!'
        | NUMBER
        ;
@end group
@end example

�ٶ�@w{@samp{1 + 2}}�Ѿ�����ȡ���ƽ�;
��������ʱӦ����ʲô?
����������ļǺ���@samp{)},
��ôǰ�����Ǻű��뱻��Լ��һ��@code{expr}.
����Ψһ��Ч�����,
��Ϊ�ƽ�@samp{)}�����һϵ�е�@w{@code{term ')'}},
��û�й�����������.

����������ķ�����@samp{!},
��ô���������ϱ��ƽ��Ա�@w{@samp{2 !}}���Ա��ƽ�����һ��@code{term}.
�����������,
�������������ƽ�֮ǰ���й�Լ,
@w{@samp{1+2}}���Ϊһ��@code{expr}.
�����ƽ�@samp{!}���ǲ����ܵ�,
��Ϊ��ô����ʹջ�в�������@code{expr '!'}.
û�й�����������������.

@vindex yychar
��ǰ�ĳ�ǰɨ��Ǻű��洢��@code{yychar}��.
@xref{Action Features, ,�ڶ�����ʹ�õ���������-Special Features for Use in Actions}.


@node Shift/Reduce
@section �ƽ�/��Լ��ͻ-Shift/Reduce Conflicts
@cindex ��ͻ(conflicts)
@cindex �ƽ�/��Լ��ͻ(shift/reduce conflicts)
@cindex ����@code{else}����(dangling @code{else})
@cindex @code{else}, ����(dangling)

�����������ڷ���һ����if-then��if-then-else��������
����������Դ�������һ�Թ���:

@example
@group
if_stmt:
          IF expr THEN stmt
        | IF expr THEN stmt ELSE stmt
        ;
@end group
@end example

@noindent
�������Ǽٶ�@code{IF},@code{THEN}��@code{ELSE}������ָ���ؼ��ֵ��ս��.

��@code{ELSE}�������Ϊ��ǰɨ��Ǻ�,
ջ�е�����(�ٶ���������Ч��)�պÿ����ɵ�һ��������й�Լ.
�����ƽ�@code{ELSE}Ҳ�ǺϷ���,
��Ϊ�����ս��ᵼ���ɵڶ���������еĹ�Լ.

�������,�ƽ����߹�Լ������Ч��,����Ϊ@dfn{�ƽ�/��Լ��ͻ(shift/reduce conflict)}.
Bison����Ƴ�ѡ��@strong{�ƽ�}�������Щ��ͻ,
�����������Ĳ��������ȼ���ָ��.
Ϊ���о���������ԭ��,
���ǽ�������һ��ѡ��(ע:ѡ���Լ)��һ���Ա�.

���ڷ�����ѡ���ƽ�@code{ELSE}.
�������Ľ���ǽ�else�Ӿ��������������if�����,
��ʹ�������������������ϵȼ�.

@example
if x then if y then win (); else lose;

if x then do; if y then win (); else lose; end;
@end example

�������������ѡ���ڿ��ܵ�ʱ���Լ�������ƽ�.
�������Ľ���ǽ�else�Ӿ��������������if�����,
��ʹ�������������������ϵȼ�:

@example
if x then if y then win (); else lose;

if x then do; if y then win (); end; else lose;
@end example

��ͻ���ڵ�ԭ���������﷨����������:
��һ�ּ򵥵�if���Ƕ�׵ķ������ǺϷ���.
�Ѿ������Ĺ�����ͨ����else�Ӿ��������������if������������;
�����BisonΪʲôѡ���ƽ������ǹ�Լ��ԭ��.
(������������,��ñ�дһ����������ķ�,
���������������ȴ���Ѱ쵽.)
���������������Algol 60���������״γ��ֲ�����Ϊ``����@code{else}''����.

Ϊ�˱���Bison������Щ����Ԥ���ĺϷ����ƽ�/��Լ��ͻ,
���ǿ���ʹ��@code{%expect @var{n}}����.
���ƽ�/��Լ��ͻ����Ŀǡ����@var{n}��ʱ��,
Bison���������κξ���.
@xref{Expect Decl, ,������ͻ����-Suppressing Conflict Warnings}.

���˱�Թ����@code{if_stmt}�Ķ���,
���ǳ�ͻ��ȷʵ��û���κζ�������ʱ�����.
����һ�����������������ͻ��Bison�����ļ�:

@example
@group
%token IF THEN ELSE variable
%%
@end group
@group
stmt:     expr
        | if_stmt
        ;
@end group

@group
if_stmt:
          IF expr THEN stmt
        | IF expr THEN stmt ELSE stmt
        ;
@end group

expr:     variable
        ;
@end example

@node Precedence
@section ���������ȼ�-Operator Precedence
@cindex ���������ȼ�(operator precedence)
@cindex �����������ȼ�(precedence of operators)

�ƽ�/��Լ��ͻҲ���ܳ�������������ʽ��.
������,�ƽ������������ȵ�ѡ��;
Bison���ڲ��������ȼ�������������ָ��ʲôʱ���ƽ���ʲôʱ���Լ.

@menu
* Ϊʲô��Ҫ���ȼ�(Why Precedence):Why Precedence.    һ��չʾΪʲô��Ҫ���ȼ�������
* ʹ�����ȼ�(Using Precedence):Using Precedence.  ��Bison���﷨�����ָ�����ȼ�
* ���ȼ�������(Precedence Example):Precedence Examples.  ��Щ������ǰ���������������ʹ�õ�
* ���ȼ��Ĺ�����ʽ(How Precedence):How Precedence.    ������ι���
@end menu

@node Why Precedence
@subsection ʲôʱ����Ҫ���ȼ�-When Precedence is Needed

��������������ķ�Ƭ��
(���������ԭ��������@w{@samp{1 - 2 * 3}}���������ַ������з���):

@example
@group
expr:     expr '-' expr
        | expr '*' expr
        | expr '<' expr
        | '(' expr ')'
        @dots{}
        ;
@end group
@end example

@noindent
����������Ѿ������˼Ǻ�@samp{1},@samp{-}��@samp{2};
��ô���Ƿ�Ӧ��ʹ�ü���������������й�Լ��?
����������һ���Ǻ�.
��Ȼ,�����һ���Ǻ���@samp{)},���Ǳ����Լ,
����û�й�����Թ�Լ@w{@samp{- 2 )}}����������ʼ�ļǺ�����,
�����ƽ�����Ч��.
���������һ��������@samp{*}����@samp{<},
��ô����һ��ѡ��:
�ƽ��͹�Լ������,���ǻ������ͬ�Ľ��.

Ҫ����BisonӦ����ô��,���Ǳ��뿼�ǽ��.
�����һ���������Ǻ�@var{op}���ƽ�,
��ô���������ȱ���Լ�Ա�������������һ����Լ�Ļ���.
���Ϊ@w{@samp{1 - (2 @var{op} 3)}}.
��һ����,������ƽ�@var{op}֮ǰ��Լ����,
���Ϊ@w{@samp{(1 - 2) @var{op} 3}}.
������,ѡ���ƽ����߹�Լ����������@samp{-}��@var{op}��������ȼ�:
@samp{*}�Ǹ����ȱ��ƽ�,������@samp{<}.

@cindex �����(associativity)
������Ϊ@w{@samp{1 - 2 - 5}}��ʱ�����ô��,
��Ӧ����@w{@samp{(1 - 2) - 5}}����@w{@samp{1 - (2 - 5)}}?
���ڴ������������˵,����ѡ��ǰ��.
�ⱻ��Ϊ@dfn{����(left association)}.
����һ��,@dfn{�ҽ��(right association)},
���ڸ�ֵ�������������ѡ��.
ѡ�����ϻ����н����
��ջ����@w{@samp{1 - 2}}���ҳ�ǰɨ��Ǻ���@samp{-}ʱ,������ѡ���ƽ����ǹ�Լ������:
�ƽ��������ҽ��.

@node Using Precedence
@subsection ָ�������������ȼ�-Specifying Operator Precedence
@findex %left
@findex %right
@findex %nonassoc

Bison������ʹ�ò��������ȼ�����@code{%left}��@code{%right}ָ����Щѡ��.
ÿһ������������������һ��Ҫ���������ȼ��ͽ���ԵļǺ��б�.
@code{%left}����ʹ��Щ��������Ϊ���ϵ�,
@code{%right}����ʹ��Щ��������Ϊ�ҽ�ϵ�.
������ѡ����@code{%nonassoc},��������
``��һ����''��������ͬ�Ĳ�������һ���﷨����.

��ͬ�����������ȼ�������������˳�����.
�ļ��еĵ�һ��@code{%left}����@code{%right}���������ȼ����,
��һ�����������Ĳ��������Ըߵ����ȼ�,�Դ�����.

@node Precedence Examples
@subsection ���ȼ�ʹ�õ�����-Precedence Examples

�����ǵ�������,���ǻᷢ�����������:

@example
%left '<'
%left '-'
%left '*'
@end example

��һ��֧�������������ĸ�������������,
���ǻ���������������ͬ���ȼ��Ĳ�����.
����@code{'+'}��@code{'-'}һ������.

@example
%left '<' '>' '=' NE LE GE
%left '+' '-'
%left '*' '/'
@end example

@noindent
(������@code{NE}������``�����''������'',�����Դ�����.
���Ǽٶ���Щ�Ǻŵĳ��ȶ���һ���ַ�������������ǵ����ִ����������ַ�.)

@node How Precedence
@subsection ���ȼ���ι���-How Precedence Works

���ȼ������ĵ�һ�������Ǹ����������ս�������ȼ�.
�ڶ��������Ǹ����ض��Ĺ��������ȼ�:
ÿ������Ӳ��������һ���ἰ���ս���л�ȡ���ȼ�.
(��Ҳ������ȷ��ָ����������ȼ�.  @xref{Contextual
Precedence, ,�������������ȼ�-Context-Dependent Precedence}.)

����,����г�ͻ�ķ����ǱȽ����ڿ��ǵĹ���ͳ�ǰɨ��Ǻŵ����ȼ�.
�����ǰɨ��Ǻŵ����ȼ�����,��ôѡ���ƽ�.
�����������ȼ�����,��ôѡ���Լ.
�����������ͬ�����ȼ�,
��ô���Ǹ����ȼ��Ľ����������ѡ��.
��ѡ��@samp{-v}(@pxref{Invocation, ,����Bison-Invoking Bison})������߳�������ļ�(The verbose output file)
˵����ÿ����ͻ����ν����.

���������еĹ���ͼǺŶ������ȼ�.
�������ͳ�ǰɨ��ǺŶ�û�����ȼ�,
��ôĬ�ϵĶ������ƽ�.

@node Contextual Precedence
@section �������������ȼ�-Context-Dependent Precedence
@cindex �������������ȼ�(context-dependent precedence)
@cindex һԪ���������ȼ�(unary operator precedence)
@cindex ���ȼ�(precedence), ����������(context-dependent)
@cindex ���ȼ�(precedence), һԪ������(unary operator)
@findex %prec

һ�������������ȼ�ͨ��������������.
���ʼ�������ܹŹ�,������ȷ�ܳ���.
@c bad translation
����,���͵�,һ�����Ų������б�һԪ���������ߵ����ȼ�
���ұȶ����Ʋ����������ȼ��Ե�(���ڳ˷�).
@c up

Bison���ȼ�����,@code{%left},@code{%right}��@code{%nonassoc}
����һ�������Ĳ�����ֻ��ʹ��һ��;
����ͨ�����ַ���,һ��������ֻ����һ�����ȼ�.
�����������������ȼ���˵,����Ҫʹ��һ�ֶ���Ļ���:
�����@code{%prec}���η�.

@code{%prec}��ָ�������Ǹ������ս�������ȼ��������ض���������ȼ�.
�Ǹ����Ų���Ҫ������ķ�ʽ�����ڹ�����.
���η����﷨Ϊ:

@example
%prec @var{terminal-symbol}
@end example

@noindent
������д�ڹ���Ĳ���֮��.
���������Ǹ������@var{terminal-symbol}�����ȼ��������Ǵ���ͨ�����Ƶ��������ȼ�.
���ı�Ĺ������ȼ���Ӱ������Ǹ�����ĳ�ͻ�Ľ������.
(@pxref{Precedence, ,���������ȼ�-Operator Precedence}).

����@code{%prec}��ν���������������.
����Ϊһ���鹹����Ϊ@code{MINUS}���ս���������ȼ�.
ʵ����û�мǺ�����������,
����������������Լ������ȼ���ʹ��.

@example
@dots{}
%left '+' '-'
%left '*'
%left UMINUS
@end example

���ڿ����ڹ�����ʹ��@code{MINUS}�����ȼ�.

@example
@group
exp:    @dots{}
        | exp '-' exp
        @dots{}
        | '-' exp %prec UMINUS
@end group
@end example

@ifset defaultprec
��������ǶԸ��Ź�������@code{%prec UNMINUS},
BisonĬĬ����Ϊ��������ͨ�������ȼ�.
����������Ѵ������ų�,
��Ϊ����ֻ�ܿ����Դ���������.

@code{%no-default-prec;}�������Ը��򵥵ط����������͵�����.
����ʹȱ��@code{%prec}���η��Ĺ���û�����ȼ�,
��ʹ�����ǲ����������ս���Ѿ��������ȼ�.

���@code{%no-default-prec;}������,
���������вμ����ȼ���ͻ����Ĺ���ָ��@code{%prec}.
��ʱ,�����㿿�ı�����﷨������ʽ������һ�����ȼ�������Bison��ν����,
������ῴ�����е��ƽ�/��Լ��ͻ.
����ܻ�Ҫ����﷨��������,
����������Ԥ������ȷ�Ĺ������ȼ�.

@code{%no-default-prec;}�����ÿ��Կ�Ĭ�ϸ�����@code{%default-prec;}����.
@end ifset

@node Parser States
@section ������״̬-Parser States
@cindex ����״̬��-finite-state machine
@cindex ������״̬(parser state)
@cindex ״̬(��������)(state (of parser))

����@code{yyparse}��ʹ������״̬��(finite-state-machine)��ʵ�ֵ�.
ѹ�������ջ�е�ֵ�������Ƿ���������;
���Ǵ�����������ջ�����߿���ջ�����ս���ͷ��ս������.
��ǰ��״̬�ռ����������һ����ô����ص�֮ǰ�������Ϣ.

ÿ�ζ���һ����ǰɨ��Ǻ�,
����������һ��������������װ��ǰ״̬�ͳ�ǰɨ��Ǻ�����.
��������ܻ�˵``�ƽ���ǰɨ��Ǻ�''
�����������,����ָ����һ���µķ�����״̬��ͬʱ�����״̬ѹ��ջ��.
����,��(ע:ָ����)Ҳ����˵``ʹ�õ�@var{n}��������й�Լ.''
����ζ��ĳЩ�����ļǺź��鱻�Ƴ�ջ,ȡ����֮����һ����.
������һ��˵��,
��Щ����(ע:@var{n})��״̬������ջ,һ����״̬��ѹ��ջ.

��������һ��ѡ��:��������ܻ�˵�Ǹ���ǰɨ��Ǻ��ڵ�ǰ��״̬���Ǵ����.
�������������.(@pxref{Error Recovery, ,����ָ�-Error Recovery}).

@node Reduce/Reduce
@section ��Լ/��Լ��ͻ-Reduce/Reduce Conflicts
@cindex ��Լ/��Լ��ͻ(reduce/reduce conflict)
@cindex ��ͻ(conflicts), ��Լ/��Լ(reduce/reduce)

һ����Լ/��Լ��ͻ���������������߸��������Ա�������ͬ�������е������.
��ͨ��������һ���﷨�е����ش���.

����,������һ����ͼ����������߸���@code{word}��Ĵ���.

@example
sequence: /* empty */
                @{ printf ("empty sequence\n"); @}
        | maybeword
        | sequence word
                @{ printf ("added word %s\n", $2); @}
        ;

maybeword: /* empty */
                @{ printf ("empty maybeword\n"); @}
        | word
                @{ printf ("single word %s\n", $1); @}
        ;
@end example

@noindent
���������һ������:�ж��ַ������Խ���һ��@code{word}������һ��@code{sequence}.
�����Թ�ԼΪһ��@code{maybeword}Ȼ��ͨ���ڶ��������ԼΪһ��@code{sequence}.
����,ʲô��û�п���ͨ����һ�������ԼΪһ��@code{sequence},
����ʹ��@code{sequence}�ĵ�������������@code{word}�������.

Ҳ�ж��ַ�����ʲô��û�й�Լ��һ��@code{sequence}.
����ֱ��ͨ����һ�������Լ���߼��ͨ��@code{maybeword}Ȼ��ͨ���ڶ��������Լ.

�������Ϊ��û��ʲô����,
��Ϊ��������������Ƿ���Ч��û��ʲô�仯.
������ȴӰ�����ִ����һ������.
һ�ַ���˳�������˵ڶ�������Ķ���,
��һ���������˵�һ���͵���������Ķ���.
�����������,�������������仯.

Bison��ѡ�����ȳ������﷨�еĹ�������Լ/��Լ��ͻ,
�����������ֲ�����ʮ��ð�յ�����.
������ϸ�о�ÿһ����Լ/��Լ��ͻ����ͨ��Ҫ��������.
������һ����ȷ����@code{sequence}�ķ���:

@example
sequence: /* empty */
                @{ printf ("empty sequence\n"); @}
        | sequence word
                @{ printf ("added word %s\n", $2); @}
        ;
@end example

����������һ��������Լ/��Լ��ͻ����ͨ����:

@example
sequence: /* empty */
        | sequence words
        | sequence redirects
        ;

words:    /* empty */
        | words word
        ;

redirects:/* empty */
        | redirects redirect
        ;
@end example

@noindent
�����Ŀ���Ƕ�һ�����԰���@code{word}��@code{redirect}�������.
@code{sequence},@code{words}��@code{redirects}�Ķ��嶼��û�������,
����������һ��ȴ����΢�������:
��ʹһ����������������޶��ַ����ķ�ʽ.

����:ʲô��û�п�����һ��@code{words}.
������������������һ�е�@code{words},��������,���������.
��ͬ��Ҳ������һ��@code{words}�������@code{redirects}������һ��@code{words}.
�ȵ�.

�������ָ�����Щ����ķ���.
��һ,ʹ����Ϊһ����������:

@example
sequence: /* empty */
        | sequence word
        | sequence redirect
        ;
@end example

�ڶ�,��ֹ@code{words}����@code{redirects}Ϊ��:

@example
sequence: /* empty */
        | sequence words
        | sequence redirects
        ;

words:    word
        | words word
        ;

redirects:redirect
        | redirects redirect
        ;
@end example

@node Mystery Conflicts
@section ���صĹ�Լ/��Լ��ͻ-Mysterious Reduce/Reduce Conflicts

[untranslated]
Sometimes reduce/reduce conflicts can occur that don't look warranted.
[/untranslated]
������һ������:

@example
@group
%token ID

%%
def:    param_spec return_spec ','
        ;
param_spec:
             type
        |    name_list ':' type
        ;
@end group
@group
return_spec:
             type
        |    name ':' type
        ;
@end group
@group
type:        ID
        ;
@end group
@group
name:        ID
        ;
name_list:
             name
        |    name ',' name_list
        ;
@end group
@end example

����ķ�������������һ����һ�ĳ�ǰɨ��Ǻŷ���:
�����ڶ���@code{para_spec}��ʱ��.
���@code{ID}�������һ���ֺ�,��ô����һ��@code{name}.
���@code{ID}�����������һ��@code{ID},��ô����һ��@code{type}.
���仰˵,����һ��@acronym{LR}(1)�ķ�.

@cindex @acronym{LR}(1)
@cindex @acronym{LALR}(1)
Ȼ��,������������������һ��,Bisonʵ���ϲ����ܴ������е�@acronym{LR}(1)�ķ�.
������ķ���,����λ��@code{param_spec}�Ŀ�ʼ,��ͬ����λ��@code{return_spec}��ʼ
,��@code{ID}֮���������ʮ������,������Bison��Ϊ��������ͬ��.
���ǿ�����������Ϊ��ͬ�Ĺ����ǻ��---��Լ��@code{name}�Ĺ���͹�Լ��@code{type}�Ĺ���.
Bison���Ǹ������׶�û������������Щ��������������������Ҫ��ͬ�ĳ�ǰɨ��Ǻ�,
������Ϊ�������������ͬһ��������״̬.
@c bad translation
������������Ļ����Ժ�����һ����ͻ.
@c up
�ڷ�����������,
���������ζ������ķ�����@acronym{LALR}(1)�ķ�.

ͨ������,������޲�©�������ǽ�©��д���ĵ�.
������������©�����ѱ��޸�;
����@acronym{LR}(1)�ķ��ķ��������������ѱ�д��������������ܴ�ķ�����.
��ʵ����,Bison�Եø�Ϊʵ��.

���������ʱ,
��ͨ������ͨ��ָ�������������ķ�����״̬
��������ʹ���ǿ�������Ȼ��ͬ�Ķ���Ķ���
���޲���,
�������������,
���µ���@code{return_spec}����һ������������������:

@example
@group
%token BOGUS
@dots{}
%%
@dots{}
return_spec:
             type
        |    name ':' type
        /* This rule is never used.  */ /*  ���������Զ���ᱻʹ�� */
        |    ID BOGUS
        ;
@end group
@end example

�����������������,
��Ϊ��@code{return_spec}��ʼ����@code{ID}�����������������һ�����ܵĶ���Ļ����.
���������@code{param_spec}��Ӧ���������в����ǻ��,
�������������Ľ����˲�ͬ�ķ�����״̬.
ֻҪ@code{yylex}��Զ�������Ǻ�@code{BOGUS},
�����Ĺ���Ͳ��ܸı���������ʵ�ʷ���.

����������������,��������һ�ֽ������ķ���:
ֱ��ʹ��ʹ��@code{ID}�����@code{name}����д@code{return_spec}�Ĺ���.
������Ҳʹ�������������������˲�ͬ�Ļ��,
@c bad translation
��Ϊ@code{return_spec}�Ļ��������@code{return_spec}�Ĺ��������@code{name}��.
@c up

@example
param_spec:
             type
        |    name_list ':' type
        ;
return_spec:
             type
        |    ID ':' type
        ;
@end example

@node Generalized LR Parsing
@section ͨ��@acronym{LR} (@acronym{GLR})����-Generalized @acronym{LR} (@acronym{GLR}) Parsing
@cindex @acronym{GLR}����(@acronym{GLR} parsing)
@cindex ͨ��@acronym{LR} (@acronym{GLR})����(generalized @acronym{LR} (@acronym{GLR}) parsing)
@cindex �����ķ�(ambiguous grammars)
@cindex ��ȷ���Է���(non-deterministic parsing)

Bison����@emph{ȷ����(determinstic)}�ķ�����.
���ַ�����������ǰ����Ͷ���ĳ�ǰɨ��Ǻŵ�ժҪ,
Ψһ�Ե�ѡ����й�Լ��ʱ������ν��й�Լ.
���,ͨ��,Bison����һ���������޹��ķ���������Լ�.
���������ķ����п���ʹ�ö��ֿ��ܵĹ�Լ���е��ַ���,
��������������²���ʹ��ȷ���ķ�����.
�������ͬ����������Ҫ����һ����ǰɨ��Ǻŵ�����,
��Ϊ������ȱ��������������Ҫ�ı�Ҫ��Ϣ,
��ʱ�����뱻������һ���ƽ�-��Լ������.
����,��֮ͬǰ�ᵽ��(@pxref{Mystery Conflicts, ,���صĳ�ͻ-Mystery Conflicts}),
@c bad translation
������һЩ����,Bison��������ܽ����������ѡ��Ŀǰ������ȱ�ٱ�Ҫ����Ϣ.
@c up

����������﷨�ļ���ʹ��@samp{%glr-parser}������ʱ��,
Bison����һ��ʹ�ò�ͬ�㷨�ķ�����,���ַ���������Ϊͨ��@acronym{LR}(��@acronym{GLR})������.
һ��Bison @acronym{GLR}������ʹ��ͬ���������㷨��Ϊһ����ͨ��Bison���������з���,
��������һ�����ܱ����ȼ�����(@pxref{Precedence, ,���ȼ�-Precedence})������ƽ�/��Լ��ͻ,
����һ����Լ/��Լ��ͻʱȴ��������ͨBison��������ͬ����Ϊ.
��һ��@acronym{GLR}�������������������ʱ��,
����Ч��@emph{����(splits)}�ɶ��������,
ÿ����Ӧһ�ֿ��ܵ��ƽ����߹�Լ.
��Щ�������糣�ؽ��з���,ʹ������(lock-step)���ļǺ�.
һЩջ�����������ĳ�ͻ���ҽ�һ������,
һ��Bison @acronym{GLR}����ջ��һ��ȡ��״̬���еĸ�Ч�ķ�����.

ʵ����,ÿ��ջ����һ��������ȷ�����Ĳ���.
ʣ���������ܻ����һ�������Ǵ����,
�����������,����ȷ��ջ��������ʧ.
����,ÿ��ջ�е����嶯�����������������ִ��.
��һ��ջ��ʧʱ,���洢�ĵ����嶯����Զ���ᱻִ��.
��һ����Լʹ����ջ�ȼ۵�ʱ��,
���ǵ����嶯�����͵��¹�Լ��״̬���ᱻ����.
����˵����ջ�ǵȼ۵�
�����Ƕ�������ͬ��״̬����,
����ÿ����Ӧ��״̬����һ��������ͬ������Ƭ�ε��﷨����.

ÿ�����������ж������״̬ת��Ϊһ������״̬ʱ,
��ִ����ԭ������Ķ�����,
�����������ת�䵽ͨ����@acronym{LALR}(1)�����㷨.
�����ת��������,һЩջ�ϵ�״̬���п��ܵĶ�����(ʵ�����Ƕ����)������ֵ.
��������ͼ����Щ��������ѡһ����@samp{%prec}����ָ��������߶�̬���ȼ��Ķ���.
����,�����ѡ��Ķ�����δ�����ȼ�����,
������������ʹ��@samp{%merge}��������ͬ�ĺϲ�����,
Bison���۲��������֮����úϲ�������ý��.
�������ᱨ��һ������.

��@acronym{GLR}������ʹ������һ�����ݽṹ�ǿ��ܵ�,
���ֽṹ���������Ե�ʱ��(�������Ĵ�С)���������@acronym{LALR}(1)�ķ�,
���������Զ��η���ʱ�䴦���κη������ķ�(��һ����@acronym{LALR}(1)),
�������������η���ʱ�䴦���κ���ͨ(�����������)�������޹��ķ�.
Ȼ��Bison��ǰʹ��һ�ָ��򵥵����ݽṹ,
�������ݽṹ��Ҫ�����볤�ȳ������������ǰ��Ҫ׺���ջ��Ŀ�ɱ�����ʱ��.
���,ʵ����,������߲�ȷ���ķ�������Ҫָ����ʱ��Ϳռ�������.
Ȼ��,���ַǳ��������ͨ������º��Ѽ���.
�ķ��еĲ�ȷ����ͨ���Ǿֲ���---������һ��ֻ�Ժ���һЩ�Ǻ�``�����ɻ�''.
���,��ǰ�����ݽṹ�ڴ����������㹻����.
�ر��,�����ķ���@acronym{LALR}(1)����,��(ע:ͨ��@acronym{GLR}������)
������Ĭ�ϵ�Biosn����������.

���ø���ϸ��@acronym{GLR}��������˵��,�����:
Elizabeth
Scott, Adrian Johnstone and Shamsa Sadaf Hussain, Tomita-Style
Generalised @acronym{LR} Parsers, Royal Holloway, University of
London, Department of Computer Science, TR-00-12,
@uref{http://www.cs.rhul.ac.uk/research/languages/publications/tomita_style_1.ps},
(2000-12-24).

@node Stack Overflow
@section ջ����Լ���α�����-Stack Overflow, and How to Avoid It
@cindex ջ���(stack overflow)
@cindex ������ջ���(parser stack overflow)
@cindex ������ջ�����(overflow of parser stack)

���̫��ļǺű��ƽ���û�б���Լ,
Bison������ջ���ܻ����.
�������������ʱ,
����������@code{yyparse}���ط���ֵ,
��ִͣ�в�����@code{yyerror}���������.

����Bison������ӵ��������ջ,
�ﵽ����ͨ��������ʹ���ҵݹ��������ݹ��������.
@xref{Recursion, ,�ݹ����-Recursive Rules}.

@vindex YYMAXDEPTH
�������@code{YYMAXDEPTH},����Կ���ջ���֮ǰ��������.
����Ӧ�����������������.
���ֵ�������֮ǰ���ƽ�(��û����Լ)�ļǺŵ������Ŀ.

������ջ�ռ䲻��Ҫһ�η������.
�����Ϊ@code{YYMAXDEPTH}ָ����һ���ܴ������,
������ʵ�����ڿ�ʼ֮������һ���ռ��С��ջ,
����׶��Ե�����,������������ջ������.
����ռ�ķ����Զ����ҳ�Ĭ�ؽ���.
���,�㲻��ҪΪ�˲���Ҫ���ٿռ����ͨ�����ʡ�ռ�
����@code{YYMAXDEPTH}����ĺ�С.

Ȼ��,����ͬ����Ҫ��@code{YYMAXDEPTH}����ĺܴ�������
�ڼ���ջ����ʱ�����������.
��������Ҳ��Ҫ��@code{YYMAXDEPTH}����ı�@code{YYINITDEPTH}��С.

@cindex Ĭ��ջ��������(default stack limit)
�����û�ж���@code{YYMAXDEPTH},��ô����Ĭ��ֵ��10000.

@vindex YYINITDEPTH
��ɿ������@code{YYINITDEPTH}Ϊһ����ֵ������ջ��ʼ����Ŀռ�.
������ʹ��C99�������������䳤��������Ժͱ�����,
����C����@acronym{LALR}(1)��������˵,
���ֵ����Ϊ����ʱ����.
@code{YYINITDEPTH}��Ĭ��ֵΪ200.

��Ҫ��@code{YYINITDEPTH}���������ڵ�����ջ�ռ�ʱ�������.
ͬ����,��Ҫ��@code{YYINITDEPTH}����@code{YYMAXDEPTH}.

@c FIXME: C++ output.
����C��C++�����ϵ�����,
����C++�������������C���Ա�д��@acronym{LALR}(1)��������������.
(ע:ָջ��������)
�����������(��ΪC++������C������),
���ǽ���������@code{YYINITDEPTH}�Ĵ�С.
�ڲ��õĽ���,
���ǻ��ṩ�漰����������C++���.

@node Error Recovery
@chapter ����ָ�-Error Recovery
@cindex ����ָ�(error recovery)
@cindex �Ӵ����лָ�(recovery from errors)

����ͨ�����ܽ�����һ�������������﷨����ʱ����ֹ.
����,һ��������Ӧ�ó�ֵĴӴ����лָ�
�Ա���������ļ������ಿ�ֲ��Ҽ�����еĴ���;
һ��������Ӧ�ý��������ı���ʽ.

��ÿ�����붼��һ�еļ򵥻��������������,
��@code{yyparse}����������ʱ����1����
ʹ�����ߺ���ʣ�µ�������(Ȼ�����µ���@code{yyparse}���㹻��.
��������ڱ�������˵��Ȼ����,
��ΪΪ�������˵��´����ȫ������������.
�ڱ�����������,���뵽һ�������ڲ����﷨����,
����Ӧ��ʹ�������Դ����������Դ�Դ�ļ��Ŀ�ʼһ��.

@findex error
����Կ���дһ��ʶ������Ǻ�@code{error}�Ĺ�����������δ��﷨�����лָ�.
������һ���Ѿ�������(�㲻��Ҫ������)���ұ�����������ʹ�õ��ս��.
ÿ��һ���﷨������ʱ,Bison�������Ͳ���һ��@code{error}�Ǻ�;
������ڵ�ǰ�����������ṩ��һ��ʶ��üǺŵĹ���,
��ô�������Լ�������.

����:

@example
stmnts:  /* empty string */ /* ���ַ��� */
        | stmnts '\n'
        | stmnts exp '\n'
        | stmnts error '\n'
@end example

@c bad translation
������ӵĵ��ĸ�����˵����һ����������һ������
���κ�@code{stmnts}����Ч������.
@c up

�����������@code{exp}�м�Ļ��ᷢ��ʲô���?
�������ָ�����,����ȷ�ؽ���ΪӦ����һ��@code{stmnts},һ��@code{error}
��һ�����еľ�ȷ����.
���һ����������һ��@code{exp}�м�,
��ô��ջ������@code{stmnts}֮��ܿ�����һЩ����ļǺŻ����Ա���ʽ,
����һЩ�Ǻ�����һ������֮ǰ������.
����������򲢲���ͨ���ķ���Ӧ��.

����Bison���Կ������������������ĺͲ���������ǿ�Ƶ�ʹ�������(ע:����ָ�����)�������������.
����,����ջ�ж���״̬�Ͷ���ֱ���ص�һ�����Խ���@code{error}��״̬.
(����ζ�ŷ��������ӱ���ʽ������,���һص����һ��������@code{stmnts}.)
��ʱ@code{error}�Ǻſ��Ա��ƽ�.
֮��,����ɵĳ�ǰɨ��ǺŲ��ܽ����ƽ���һ���Ǻ�,
����������ǺŲ��Ҷ�������ֱ���ҵ�һ�����Խ��ܵļǺ�.
�����������,Bison���벢��������ֱ����һ�����з��Ա�Ӧ�õ��ĸ�����.
ע�⵽�����ķ���ͨ�����ڴ�й¶֮Դ,����@ref{Destructor Decl, , 
�ͷŶ����ķ���-Freeing Discarded Symbols}�Ի�ȡ������Ϣ.

���﷨��,���ڴ���ָ������ѡ����ǶԴ���ָ����Ե�ѡ��.
һ���򵥶�ʹ�õĲ����������⵽һ������,������ǰ�����е�ʣ�ಿ��:

@example
stmnt: error ';'  /* On error, skip until ';' is read.  */ /* ���������ʱ,����ʣ�ಿ��ֱ������ ';' */
@end example

Ϊһ���Ѿ������������Żָ�ƥ��һ��������Ҳ�Ƿǳ�ʵ�õ�.
����,�����źܿ��ܲ�ƥ��س��ֲ�����������ĸ����صĴ�����Ϣ:

@example
primary:  '(' expr ')'
        | '(' error ')'
        @dots{}
        ;
@end example

����ָ������Ǳ�Ҫ�Ĳ²�.
�����ǲ²��ʱ��,һ���﷨����ͨ���ᵼ������һ������.
�������������,
�������²�:һ������������һ��@code{stmnt}�еĴ������������.
����һ��α��ķֺű����뵽һ����Ч��@code{stmt}�м�.
�ڴ���ָ�����ӵ�һ����ָ�֮��,�����������̷�������һ������,
��Ϊ��α��ķֺ�֮�������Ҳ��һ����Ч��@code{stmt}.

Ϊ����ֹ�������й����,
�������ڵ�һ������֮������������һ������ʱ,�������������Ϣ;
�����������������ݼǺű��ɹ���Լ֮��,�������Ż�ָ����������Ϣ.

ע�⵽����@code{error}�ǺŵĹ����������κι���һ��Ҳ�����ж���.

@findex yyerrok
�����ͨ��ʹ�ú�@code{yyerrok}ʹ������Ϣ�����ָ�.
������ڴ���ָ�����Ķ�����ʹ����,
û���κδ�����Ϣ�ᱻ����.
����겻��Ҫ�κβ���;
@samp{yyerrok;}��һ����Ч��C���.

@findex yyclearin
��ǰ�ĳ�ǰɨ��Ǻ���һ�������ᱻ�����ٷ���.
������ǲ��ɽ��ܵ�,
��ô��@code{yyclearin}���������������Ǻ�.
�����@samp{yyclearin;}д�����ָֻ�����Ķ�����.

����,����������һ���﷨����ʱ,
һ�����������򱻵������ڽ�������ǰ�������¿�ʼ�����ĵط�.
�ʷ����������ص���һ���Ǻźܿ�������ȷ��.
ǰһ����ǰɨ��Ǻ�Ӧ����@samp{yyclearin;}����.

@vindex YYRECOVERING
��@code{YYRECOVERING}����һ������ʽ.
�������ʽ�ڷ��������﷨�����лָ�ʱֵΪ1,��������ʱ��ֵΪ0.
ֵΪ1ָ����Ҫ�����µ��﷨��������Ĵ�����Ϣ.

@node Context Dependency
@chapter ��������������-Handling Context Dependencies

Bison�ķ���ģʽ�����ȷ����Ǻ�,֮��������ϳɸ���ľ䷨��Ԫ.
������������,һ���Ǻŵ������ܵ������ĵ�Ӱ��.
�������ƻ���Bison����,
ĳЩ����(����Ϊ@dfn{kludges})����ʹ��������Ϊ�������Ա�дBison������.

@menu
* ����Ǻ�(Semantic Tokens):Semantic Tokens.   �ԼǺŵķ�����������������������.
* �ʷ�����(Lexcial Tie-ins):Lexical Tie-ins.   �ԼǺŵķ����������������Թ����������.
* �����ָ�(Tie-in Recovery):Tie-in Recovery.   �ʷ�����������α�д����ָ�����İ�ʾ.
@end menu

(ʵ����, ``kludge''��˼�ǼȲ��ɾ�Ҳ����׳�����ĳ����ļ���)

@node Semantic Tokens
@section ���������е�������Ϣ-Semantic Info in Token Types

C���Ծ�������������:
��ʶ��ʹ�õķ��������ڵ���ǰ������.
����,�������:

@example
foo (x);
@end example

�⿴������һ�������������,�����@code{foo}��һ��typedef����,
��ô��ʵ������һ��@code{x}������.
C���Ե�Bison��������ξ�����ô�������������?

@acronym{GNU} Cʹ�õİ취���������в�ͬ�ļǺ�����,
@code{INDENTIFIER}��@code{TYPENAME}.
��@code{yylex}����һ����ʶ��,
��������ǰ�ı�ʶ�������Ա��������ʲô���ļǺ�����:
�����ʶ����һ��typedef������,�ͷ���@code{TYPENAME},���򷵻�@code{IDENTIFIER}.

��ʱ,�﷨����Ϳ���ͨ����Ҫʶ��ļǺ����͵�ѡ������������������.
@code{IDENTIFIER}������Ϊһ������ʽ������,����@code{TYPENAME}ȴ����.
@code{TYPENAME}���Կ�ʼһ������,����@code{IDENTIFIER}ȴ������.
�ڱ�ʶ��������@emph{��}���Ե���������,
@c bad translation
�����ڿ�������һ��typedef���Ƶ�������,
@code{TYPENAME}��@code{IDENTIFIER}���ǿɽ��ܵ�---
��û��һ�����ûһ�ּǺ����͵Ĺ���.
@c up

@c bad translation
����ڽӽ�������ʶ���ĵط���������ʲô����ı�ʶ��,
��ô����������Լ򵥵�Ӧ��.
@c up
������C������ȴ����������:
C������������֮ǰ�����Ĵ�����ȷ���͵�typedef����.

@example
typedef int foo, bar, lose;
static foo (bar);        /* @r{redeclare @code{bar} as static variable} */ /* @r{��������@code{bar}Ϊһ����̬����} */
static int foo (lose);   /* @r{redeclare @code{foo} as function} */ /* @r{��������@code{foo}Ϊһ������} */
@end example

���ҵ���,������Ʊ�һ�����ӵľ䷨�ṹ---``������''���ָ�.

���,C���Ե�Bison��������ĳЩ����Ҫ������,����Ҫ�ı����з��ս��������:
һ����Ϊ�˷������Ա��ض����typedef����,
һ����Ϊ�˷������ܱ��ض��������.
�����Ǹ��ƵĲ���.
Ϊ�˼��ʡ���˶���.

@example
initdcl:
          declarator maybeasm '='
          init
        | declarator maybeasm
        ;

notype_initdcl:
          notype_declarator maybeasm '='
          init
        | notype_declarator maybeasm
        ;
@end example

@noindent
������@code{initdcl}������������һ��typedef����,
����@code{notype_initdcl}ȴ����.
@c bad translation
@code{declarator}��@code{notype_declarator}����������ͬһ���͵Ĳ�ͬ����.
@c up

���ּ����ʹʷ���������(����һ������)��һЩ����֮��.
@c skip
@c [untranslated]
@c in that information (which alters the lexical analysis) is changed during 
@c parsing by other parts of the program.
@c [/untranslated]
@c up
���ǵ�������,�������Ϣ��ȫ�ֵĲ������ڳ��������Ŀ��.
һ�������Ĵʷ���������һ���������Ŀ��Ƶ�����Ŀ�ı�־.

@node Lexical Tie-ins
@section �ʷ�����-Lexical Tie-ins
@cindex �ʷ�����(lexical tie-in)

����һ�ִ��������������ķ�����@dfn{�ʷ�����(lexical tie-in)}: 
һ����Bison�������õı�־,
����Ŀ���Ǹı�����Ǻŵķ�ʽ.

����,����������һ������C������,
����������һ�������@samp{hex (@var{hex-expr})}�ṹ.
�ڹؼ���@code{hex}֮����һ������֮��ȫ��Ϊʮ�����������ı���ʽ.
�ر��,���Ǹ���������,�Ǻ�@samp{a1b}���뱻������һ������������һ����ʶ��.
�����������δ�����:

@example
@group
%@{
  int hexflag;
  int yylex (void);
  void yyerror (char const *);
%@}
%%
@dots{}
@end group
@group
expr:   IDENTIFIER
        | constant
        | HEX '('
                @{ hexflag = 1; @}
          expr ')'
                @{ hexflag = 0;
                   $$ = $4; @}
        | expr '+' expr
                @{ $$ = make_sum ($1, $3); @}
        @dots{}
        ;
@end group

@group
constant:
          INTEGER
        | STRING
        ;
@end group
@end example

@noindent
�������Ǽ���@code{yylex}�۲�@code{hexflag}��ֵ;
������ֵ����ʱ,���е�������������ʮ��������,
���Ҵ�����ĸ�ı�ʶ��Ҳ�����ܵı����������.

@code{hexflag}�����ڷ������ļ���@var{Prologue}�����Ա㶯�����Է�����
(@pxref{Prologue, ,@var{Prologue}����-The Prologue}).
�㻹������@code{yylex}�б�д��������������־.

@node Tie-in Recovery
@section �ʷ������ʹ���ָ�-Lexical Tie-ins and Error Recovery

�ʷ���������ʹ�õ��κδ���ָ��������ϸ��Ҫ��.
@xref{Error Recovery, ,����ָ�-Error Recovery}.

������ԭ���Ǵ���ָ������Ŀ���Ƿ�����һ���ṹ�ķ������һָ���ĳ������Ľṹ��ȥ.
������,������C��������,
һ�����͵Ĵ���ָ������������Ǻ�ֱ����һ���ֺ�,
���ҿ�ʼ����һ���µ����,
������:

@example
stmt:   expr ';'
        | IF '(' expr ')' stmt @{ @dots{} @}
        @dots{}
        error ';'
                @{ hexflag = 0; @}
        ;
@end example

�����@samp{hex (@var{expr})}֮�д���һ���﷨����,
�������ָ�����ͻᱻӦ��,
������@samp{hex (@var{expr})}�Ķ�����Զ������ִ��.
���Զ���������������ֱ����һ���ؼ���@code{hex},
@code{hexflag}��Ȼ����1.��ᵼ�±�ʶ��������ؽ���Ϊ����.

Ϊ�˱����������,����ָ������Լ�Ҫ��@code{hexflag}����.

Ҳ�п��ܴ���һ�������ʽһ�����Ĵ���ָ�����.
����,������һ��Ӧ��������ƥ��Ĺ���,
��������Ծ��������:

@example
@group
expr:   @dots{}
        | '(' expr ')'
                @{ $$ = $2; @}
        | '(' error ')'
        @dots{}
@end group
@end example

������������@code{hex}�ṹ��ִ��,
����������Ǹ��ṹ(�����������ڽṹ�ڲ�������(ע:�ṹָ@code{hex}�ṹ)).
���,����Ӧ�ý���־����:
@code{hex}�ṹ�����ಿ��Ӧ���ڸñ�־��Ȼ��Ч������±�����.

�����һ���������������ʱ��״�����ܷ���@code{hex}�ṹҲ���ܲ������Ļ�,
���Ǹ���ô��?
û�а취��дһ�����Ծ����Ƿ����@code{hex}�ṹ�Ķ���.
����,�����ʹ���˴ʷ�����,
��ñ�֤��Ĵ���ָ���������������.
�����Ҫȷ��ÿ����������Ҫ������ܲ�Ҫ����.


@c ================================================== Debugging Your Parser

@node Debugging
@chapter ��ʽ��ķ�����-Debugging Your Parser

����������������һ����ս,�ر��㲻���������㷨��ʱ��
(@pxref{Algorithm, ,Bison�������㷨-The Bison Parser Algorithm}).
��ʹ������,��Щʱ��һ�������Զ�����ϸ�������ܻ���������
(@pxref{Understanding, ,������ķ�����- Understanding Your Parser}),
���߸��ٷ�������ִ�п��Ը������Ϊ��ʲô��������ȷ����ΪһЩ���.
(@pxref{Tracing, ,������ķ�����- Tracing Your Parser}).

@menu
* ����(Understanding):Understanding.     ������ķ������Ľṹ
* ����(Tracing):Tracing.           ������ķ�������ִ��
@end menu

@node Understanding
@section ������ķ�����-Understanding Your Parser

��ͬ���ĵ���������������
(@pxref{Algorithm, ,Bison�������㷨-The Bison Parser Algorithm}),
Bison��������@dfn{�ƽ�/��Լ�Զ���(shift/reduce automata)}.
��һЩ�����(����ϣ����Ҫ��Ƶ��),
�������߼򵥵�����һ����������Ҫ��������Զ���.
Bions�ṩ����(�Զ���)�����ֱ�ʾ����,�ı��Ļ���ͼ�ε�(��Ϊһ��@acronym{VCG}�ļ�).

��ָ��ѡ��@option{--report}����@option{--verbose}ʱBison�����ı��ļ�,
@xref{Invocation, ,����Bison-Invoking Bison}.
�����������Ƴ�����������ļ���@samp{.tab.c}����@samp{.c}������@samp{.output}ȡ��.
���,��������ļ���@file{foo.y},
��ôĬ�ϵķ������ļ�Ϊ@file{foo.tab.c}.
���,�߳�(verbose)����ļ�Ϊ@file{foo.output}.

������﷨�ļ�@file{calc.y}�����Ժ�ʹ��:

@example
%token NUM STR
%left '+' '-'
%left '*'
%%
exp: exp '+' exp
   | exp '-' exp
   | exp '*' exp
   | exp '/' exp
   | NUM
   ;
useless: STR;
%%
@end example

@command{bison} ����:

@example
calc.y: warning: 1 useless nonterminal and 1 useless rule
calc.y:11.1-7: warning: useless nonterminal: useless
calc.y:11.10-12: warning: useless rule: useless: STR
calc.y: conflicts: 7 shift/reduce
@end example

��ָ��@option{--report=state},
�����ļ�@file{calc.tab.c},
���������˰���������ϸ��Ϣ���ļ�@file{calc.outut}.
����;�ȷ������˳�����������ͬ,
���ǶԴ˵Ľ�������ͬ��.

��һ�����ְ�������ǰ�����/�����Խ���ĳ�ͻ����ϸ��Ϣ.

@example
Conflict in state 8 between rule 2 and token '+' resolved as reduce.
Conflict in state 8 between rule 2 and token '-' resolved as reduce.
Conflict in state 8 between rule 2 and token '*' resolved as shift.
@exdent @dots{}
@end example

@noindent
��һ�������г�����Ȼ�г�ͻ��״̬�嵥.

@example
State 8 conflicts: 1 shift/reduce
State 9 conflicts: 1 shift/reduce
State 10 conflicts: 1 shift/reduce
State 11 conflicts: 4 shift/reduce
@end example

@noindent
@cindex �Ǻ�(token), û�ô�(useless)
@cindex û�ô��ļǺ�(useless token)
@cindex ���ս��(nonterminal), û�ô�(useless)
@cindex û�ô��ķ��ս��(useless nonterminal)
@cindex ����(rule), û�ô�(useless)
@cindex û�ô��Ĺ���(useless rule)
��һ�����ֱ�����û���ô��ļǺ�,���ս���͹���.
û�ô��ķ��ս���͹����Ƴ��Ա����һ����С�ķ�����,
����û�üǺű�����,��Ϊ���ǿ��ܱ�ɨ����ʹ��,
(Ӧ��ע�⵽``û�ô���''��``û��ʹ�õ�''֮�������).

@example
Useless nonterminals:
   useless

Terminals which are not used:
   STR

Useless rules:
#6     useless: STR;
@end example

@noindent
��һ����������������Bisonʹ�õľ�ȷ�﷨:

@example
Grammar

  Number, Line, Rule
    0   5 $accept -> exp $end
    1   5 exp -> exp '+' exp
    2   6 exp -> exp '-' exp
    3   7 exp -> exp '*' exp
    4   8 exp -> exp '/' exp
    5   9 exp -> NUM
@end example

@noindent
���ұ�����ʹ�õķ���:

@example
Terminals, with rules where they appear

$end (0) 0
'*' (42) 3
'+' (43) 1
'-' (45) 2
'/' (47) 4
error (256)
NUM (258) 5

Nonterminals, with rules where they appear

$accept (8)
    on left: 0
exp (9)
    on left: 1 2 3 4 5, on right: 0 1 2 3 4
@end example

@noindent
@cindex ��Ŀ(item)
@cindex ָ������(pointed rule)
@cindex ����(rule), ָ����(pointed)
Bison֮����뵽�Լ����Զ���,
������@dfn{��Ŀ(items)}��,Ҳ����Ϊ@dfn{ָ������(pointed rules)},������ÿ��״̬.
ÿ������һ������ʽ����,���Ҵ��б�ʾ������ĵ��.

@example
state 0

    $accept  ->  . exp $   (rule 0)

    NUM         shift, and go to state 1

    exp         go to state 2
@end example

��Щ�����º���: ``״̬0��Ӧ�ش��ڷ����Ŀ�ʼ,
�ڳ�ʼ������,���ڿ�ʼ����(������@code{exp})���Ҷ�.
����������Լ��һ��������@code{exp}�Ĺ��򲢷������״̬֮��,
��������ת��״̬2.
���û�������ķ��ս��ת�����ҳ�ǰɨ��Ǻ���@code{NUM},
��ô����Ǻű��ƽ���������ջ��,��������ת��״̬1.
�κ������ĳ�ǰɨ��ǺŶ�������һ���﷨����.''

@cindex ����(core), ��Ŀ��(item set)
@cindex ��Ŀ������(item set core)
@cindex ����(kernel), ��Ŀ��(item set)
@cindex ��Ŀ������(item set core)
��ʹ״̬0�е�Ψһ����������ǹ���0,
���潫@code{NUM}�о�Ϊһ����ǰɨ��Ǻ�,
������Ϊ@code{NUM}�������κ�ת��@code{exp}�Ĺ���Ŀ�ͷ.
Ĭ�ϵ�,Bison������Ŀ���ĺ���(@dfn{core} or @dfn{kernel} of the item set).
�����������鿴����ϸ����Ϣ,�����ʹ��ѡ��@option{--report=itemset}����@command{bison}
���г����е���Ŀ,������Щ�����ɴ�������.

@example
state 0

    $accept  ->  . exp $   (rule 0)
    exp  ->  . exp '+' exp   (rule 1)
    exp  ->  . exp '-' exp   (rule 2)
    exp  ->  . exp '*' exp   (rule 3)
    exp  ->  . exp '/' exp   (rule 4)
    exp  ->  . NUM   (rule 5)

    NUM         shift, and go to state 1

    exp         go to state 2
@end example

@noindent
��״̬1��...

@example
state 1

    exp  ->  NUM .   (rule 5)

    $default    reduce using rule 5 (exp)
@end example

@noindent
����5,@samp{exp: NUM;}��������.
���۳�ǰɨ��Ǻ�(@samp{$default})��ʲô,�����������Լ��.
����Ǵ�״̬0��ת����,�ڹ�Լ֮���ص���״̬0,����֮�����ת��״̬2(@samp{exp: go to state 2}).

@example
state 2

    $accept  ->  exp . $   (rule 0)
    exp  ->  exp . '+' exp   (rule 1)
    exp  ->  exp . '-' exp   (rule 2)
    exp  ->  exp . '*' exp   (rule 3)
    exp  ->  exp . '/' exp   (rule 4)

    $           shift, and go to state 3
    '+'         shift, and go to state 4
    '-'         shift, and go to state 5
    '*'         shift, and go to state 6
    '/'         shift, and go to state 7
@end example

@noindent
��״̬2��,�Զ���ֻ�ܽ��й�Լ����.
����,������Ŀ@samp{exp -> exp . '+' exp},�����ǰɨ��Ǻ�Ϊ@samp{+},
���ᱻ�ƽ���������ջ��,����״̬�����ƻ���ת��״̬4,
��Ӧ��Ŀ@samp{exp -> exp '+' . exp}.
����û��Ĭ�϶���,�κη������г��ļǺŻ�����һ���﷨����.

״̬3����Ϊ@dfn{��̬(finial state)})����@dfn{����̬(accepting state)}:

@example
state 3

    $accept  ->  exp $ .   (rule 0)

    $default    accept
@end example

@noindent
��ʼ�����Ѿ����(�Ѿ���ȡ��ʼ���ź������ս�),
�����ɹ��˳�.

״̬4��7���͵ĺ�ֱ��,���������Լ�����:

@example
state 4

    exp  ->  exp '+' . exp   (rule 1)

    NUM         shift, and go to state 1

    exp         go to state 8

state 5

    exp  ->  exp '-' . exp   (rule 2)

    NUM         shift, and go to state 1

    exp         go to state 9

state 6

    exp  ->  exp '*' . exp   (rule 3)

    NUM         shift, and go to state 1

    exp         go to state 10

state 7

    exp  ->  exp '/' . exp   (rule 4)

    NUM         shift, and go to state 1

    exp         go to state 11
@end example

���籨�濪ʼ����������,@samp{State 8 conflicts:1 shift/reduce}:

@example
state 8

    exp  ->  exp . '+' exp   (rule 1)
    exp  ->  exp '+' exp .   (rule 1)
    exp  ->  exp . '-' exp   (rule 2)
    exp  ->  exp . '*' exp   (rule 3)
    exp  ->  exp . '/' exp   (rule 4)

    '*'         shift, and go to state 6
    '/'         shift, and go to state 7

    '/'         [reduce using rule 1 (exp)]
    $default    reduce using rule 1 (exp)
@end example

��ȷ,�������볬ǰɨ��Ǻ�@samp{/}�����Ķ���:
�����ƽ�(����ת��״̬7),���߹�Լ����1.
�����ͻ��ζ�Ż����﷨������Ļ��߷�����ȱ��������ȷ��������Ϣ.
����﷨ȷʵ�������,��Ϊ���ǲ�δָ��@samp{/}�����ȼ�,
����@samp{NUM + NUM / NUM}���Ա�����Ϊ��Ӧ���ƽ�@samp{/}��@samp{NUM + (NUM / NUM)},
Ҳ���Ա�����Ϊ��Ӧ�ڹ�Լ����1��@samp{(NUM + NUM) / NUM}.

������@acronym{LALR}(1)������ֻ������һ������,
Bison��ϵ�ѡ��ʹ�ù�Լ,����@ref{Shift/Reduce, ,�ƽ�/��Լ��ͻ-Shift/Reduce Conflicts}.
�������Ķ����������ڷ�������.

ע�⵽��ǰ������״ֻ̬��һ����һ���ܵĶ���:
�����ƽ���һ���ǺŲ���ת����Ӧ��״̬,
���߹�Լһ������.
�������������,
����,
���ƽ�@emph{��}��Լ���ǿ��ܵĻ���@emph{���}��Լ���ǿ��ܵ�,
������Ҫ��ǰɨ��Ǻ���ѡ����.
״̬8��������һ��״̬:�����ǰɨ��Ǻ���@samp{*}����@samp{/}
��ô�������ƽ�,�������ǹ�Լ����1.
���仰˵,ǰ����,��Ӧ�ڹ���1,����ǰɨ��Ǻ���@samp{*}��ʱ���ǲ�����������,
��Ϊ����ָ����@samp{*}�б�@samp{+}���ߵ����ȼ�.
����ͨ��˵,
һЩ��Ŀ����ĳЩ���ܵĳ�ǰɨ��Ǻ����Ƿ���������.
��ʹ��ѡ��@option{--report=look-ahead},Bison��ָ����Щ��ǰɨ��Ǻ�:

@example
state 8

    exp  ->  exp . '+' exp  [$, '+', '-', '/']   (rule 1)
    exp  ->  exp '+' exp .  [$, '+', '-', '/']   (rule 1)
    exp  ->  exp . '-' exp   (rule 2)
    exp  ->  exp . '*' exp   (rule 3)
    exp  ->  exp . '/' exp   (rule 4)

    '*'         shift, and go to state 6
    '/'         shift, and go to state 7

    '/'         [reduce using rule 1 (exp)]
    $default    reduce using rule 1 (exp)
@end example

�����״̬��֮����:

@example
state 9

    exp  ->  exp . '+' exp   (rule 1)
    exp  ->  exp . '-' exp   (rule 2)
    exp  ->  exp '-' exp .   (rule 2)
    exp  ->  exp . '*' exp   (rule 3)
    exp  ->  exp . '/' exp   (rule 4)

    '*'         shift, and go to state 6
    '/'         shift, and go to state 7

    '/'         [reduce using rule 2 (exp)]
    $default    reduce using rule 2 (exp)

state 10

    exp  ->  exp . '+' exp   (rule 1)
    exp  ->  exp . '-' exp   (rule 2)
    exp  ->  exp . '*' exp   (rule 3)
    exp  ->  exp '*' exp .   (rule 3)
    exp  ->  exp . '/' exp   (rule 4)

    '/'         shift, and go to state 7

    '/'         [reduce using rule 3 (exp)]
    $default    reduce using rule 3 (exp)

state 11

    exp  ->  exp . '+' exp   (rule 1)
    exp  ->  exp . '-' exp   (rule 2)
    exp  ->  exp . '*' exp   (rule 3)
    exp  ->  exp . '/' exp   (rule 4)
    exp  ->  exp '/' exp .   (rule 4)

    '+'         shift, and go to state 4
    '-'         shift, and go to state 5
    '*'         shift, and go to state 6
    '/'         shift, and go to state 7

    '+'         [reduce using rule 4 (exp)]
    '-'         [reduce using rule 4 (exp)]
    '*'         [reduce using rule 4 (exp)]
    '/'         [reduce using rule 4 (exp)]
    $default    reduce using rule 4 (exp)
@end example

@noindent
ע�⵽״̬11������ͻ��������Ϊȱ��@samp{/}�����@samp{+},@samp{-}��@samp{*}�����ȼ�,
�����ڲ�δָ��@samp{/}�Ľ����.

@node Tracing
@section ������ķ�����-Tracing Your Parser
@findex yydebug
@cindex ����(debugging)
@cindex ׷�ٷ�����(tracing the parser)

���Bison�﷨������ȷ���������е�ʱ��δ�ﵽ����Ҫ��Ŀ��,
@code{yydeug}������׷�����Կ��԰���ָ��ԭ��.

�ж��ַ�������׷�ٻ��Ƶı���:

@table @asis
@item �� @code{YYDEBUG}
@findex YYDEBUG
��������������ʱ��,����@code{YYDEBUG}����ɷ���ָ.
���ַ�ʽ��@acronym{POSIX} Yacc����.
�����ʹ��@samp{-DYYDEBUG=1}��Ϊһ��������ѡ���������Խ�@samp{define YYDEBUG 1}
�����﷨�ļ���@var{Prologue}����.(@pxref{Prologue, ,@var{Prologue}����- The Prologue}).

@item ѡ�� @option{-t}, @option{--debug}
��������Bison(@pxref{Invocation, ,����Bison-Invoking Bison})ʱ,
ʹ��@samp{-t}ѡ��.
��Ҳ��@acronym{POSIX}����.

@item ָ�� @samp{%debug}
@findex %debug
����@code{%debug}ָ��(@pxref{Decl Summary, ,Bison�����ܽ�-Bison Declaration Summary}).
����һ��Bison��չ,��BisonΪ��ʹ��Ԥ�����������������������ʱ���ʵ��.
������Ҫ����@acronym{POSIX}����ֲ������,
��������һ���ܺõĽ������.
@end table

���ǽ�����Ӧ�����Ǽ����ʽѡ���Ա���ʱ���е���.

׷�ٻ���ʹ��@code{YYFPRINTF (stderr, @var{format}, @var{args})}��ʽ�ĺ���������Ϣ.
������@var{format}��@var{args}����ͨ��@code{printf}�ĸ�ʽ�Ͳ���.
����㶨��@code{YYDEBUG}Ϊһ������ֵ����û�ж���@code{YYFPRINTF},
@code{<stdio.h>}�Զ������벢��@code{YYPRINTF}������Ϊ@code{fprintf}.

һ����ʹ����׷�ٻ��Ʊ������,
����һ��׷�ٵķ������ڱ���@code{yydebug}�д洢һ������ֵ.
����Կ���дC����(Ҳ����@code{main}��)������һ��,
��Ҳ����ʹ��C���������ı����ֵ.

��@code{yydebug}Ϊ�����ʱ��,������ִ�е�ÿһ��������һ��д��@code{stderr}һ���е�׷����Ϣ.
׷����Ϣ��������Щ����:

@itemize @bullet
@item
ÿ�ε���@code{yylex}ʱ,��ȡ�Ǻŵ�����.

@item
ÿ���ƽ��Ǻŵ�ʱ��,������ջ����Ⱥ�����������.
(@pxref{Parser States, ,������״̬-Parser States})

@item
ÿ�ι�Լһ������ʱ,����������ĸ�����,���ڹ�Լ֮��״̬ջ����������.
@end itemize

Ū����Щ��Ϣ����˼�����ڲ�����Bisonѡ��@samp{-v}�������б��ļ�(listing file).
(@pxref{Invocation, ,����Bison-Invoking Bison}).
����ļ����ո��ֹ����λ��չʾ��ÿ��״̬������,
��չʾ��ÿ��״̬����������ÿ������Ǻ�.
�����Ķ�������׷����Ϣʱ,
����Կ������������������б��ļ��е�ָʾ����.
������ᵽ�﷢������������ĵط�,
������ᷢ���﷨����һ�����ִ�������.

�������ļ���һ��C����,�����ʹ��C��ʽ��������,
�������Ǻ��ѽ���������Щʲô.
������������һ������״̬��������,
���˶�������������ִ����ͬ�Ĵ���.
ֻ�б�����ֵ���ܱ�ʾ�������﷨���Ǹ��ط�����.

@findex YYPRINT
������Ϣͨ��������ÿ������Ǻŵķ������Ͷ�������������ֵ.
����Զ�һ����Ϊ@code{YYPRINT}�ĺ�����ӡ���ֵ.
����㶨��@code{YYPRINT},
��Ӧ������������.
�����������ݱ�׼I/O��,�Ǻ����͵�������ͼǺ�ָ(��@code{yylval}��).

������һ�������ڶ๦�ܼ�������@code{YYPRINT}
(@pxref{Mfcalc Decl, ,@code{mfcalc}����������-Declarations for @code{mfcalc}}):

@smallexample
%@{
  static void print_token_value (FILE *, int, YYSTYPE);
  #define YYPRINT(file, type, value) print_token_value (file, type, value)
%@}

@dots{} %% @dots{} %% @dots{}

static void
print_token_value (FILE *file, int type, YYSTYPE value)
@{
  if (type == VAR)
    fprintf (file, "%s", value.tptr->name);
  else if (type == NUM)
    fprintf (file, "%d", value.val);
@}
@end smallexample

@c ================================================= Invoking Bison

@node Invocation
@chapter ����Bison-Invoking Bison
@cindex ����Bison(invoking Bison)
@cindex Bison����(Bison invocation)
@cindex Bison�ĵ���ѡ��(options for invoking Bison)

����Bison��ͨ����������:

@example
bison @var{infile}
@end example

�����@var{file}��ͨ����@samp{.y}��β���﷨�ļ���.
�������ļ�����@file{.tab.c}����@samp{.y}ȡ��.
���,@samp{bison foo.y}����@file{foo.tab.c},
@samp{bison hack/foo.y}����@file{hack/foo.tab.c}.
����������﷨�ļ���ʹ��C++���������C,
��������Ϊ@file{foo.ypp}����@file{foo.y++}.
��ô,����ļ�����չ�����͸���������
(�ֱ�Ϊ@file{foo.tab.cpp}��@file{foo.tab.c++}.

����:

@example
bison -d @var{infile.yxx}
@end example
@noindent
�������@file{infile.tab.cxx}��@file{infile.tab.hxx},����

@example
bison -d -o @var{output.c++} @var{infile.y}
@end example
@noindent
�����@file{output.c++}��@file{outfile.h++}.

Ϊ����@acronym{POSIX}����,
��׼��Bison���а�Ҳ����һ����Ϊ@command{yacc}�Ľű�,
�ýű�ʹ��@option{-y}ѡ�����Bison.

@menu
* Bisonѡ��(Bison Options):Bison Options.     ����дѡ�����ĸ˳����ϸ��������ѡ��
* ѡ����(Option Cross Key):Option Cross Key.  ����ĸ˳���г���ѡ��
* Yacc��(Yacc Library):Yacc Library.      ��Yacc���ݵ�@code{yylex}��@code{main}
@end menu

@node Bison Options
@section Bisonѡ��-Bison Options

Bison��֧�ִ�ͳ�ĵ���ĸѡ��Ҳ֧�ֿɼ��䳤ѡ������.
��@samp{--}ȡ��@samp{-}��ָ������������.
Bison����ѡ��������дֻҪ������Ψһ��.
����ѡ�����һ������,��@samp{--file-prefix},
��@samp{=}����ѡ�����ƺͲ���.

������һ��Bison�������õ�ѡ���嵥,
���ն�ѡ����ĸ˳������.
����֮����һ����ѡ��Ľ����.

@c Please, keep this ordered as in `bison --help'.
@noindent
����ģʽ:
@table @option
@item -h
@itemx --help
��ӡһ��Bison������ѡ����ܽᲢ�˳�.

@item -V
@itemx --version
��ӡBison�İ汾�Ų��˳�.

@need 1750
@item -y
@itemx --yacc
��@samp{-o y.tab.c}�ȼ�;
����������ļ���Ϊ@file{y.tab.c},
�������������Ϊ@file{y.output}��@file{y.tab.h}.
���ѡ���Ŀ����ģ��Yacc������ļ���������.
���,���µ�shell�ű��������Yacc,
����Bison���а����һ������Ϊ@acronym{POSIX}���ݵĽű�.

@example
#! /bin/sh
bison -y "$@@"
@end example
@end table

@noindent
����������:

@table @option
@item -S @var{file}
@itemx --skeleton=@var{file}
ָ��Ҫʹ�õĹǼ�(skeleton).
���������ڿ���Bison����ܿ��ܲ���Ҫ���ѡ��.

@item -t
@itemx --debug
�ڷ������ļ���,�����@code{YYDEBUG}Ϊ1,�����û�ж�����,
�Ա���Ի��Ʊ�����.
@xref{Tracing, ,׷����ķ�����-Tracing Your Parser}.

@item --locations
@code{%locations}��αװ.@xref{Decl Summary, ,�����ܽ�-Decl Summary}.

@item -p @var{prefix}
@itemx --name-prefix=@var{prefix}
@code{%name-prefix="@var{prefix}"}��αװ.
@xref{Decl Summary, ,�����ܽ�-Decl Summary}.

@item -l
@itemx --no-lines
�ڷ������ļ��в������κε�@code{#line}Ԥ����������.
Bisonͨ�������Ƿ���������ļ��Ա�C������͵�������������������Դ�ļ�,
�﷨�ļ�.
���ѡ���������󵽷������ļ�,������Ϊһ��������Դ�ļ�.

@item -n
@itemx --no-parser
@code{%no-parser}��αװ.
@xref{Decl Summary, ,�����ܽ�-Decl Summary}.

@item -k
@itemx --token-table
@code{%token-table}��αװ.
@xref{Decl Summary, ,�����ܽ�-Decl Summary}.
@end table

@noindent
�������:

@table @option
@item -d
@itemx --defines
αװ@code{%defines},����,��һ��������ļ�д���﷨�мǺ��������Ƶĺ궨���һЩ����������.
@xref{Decl Summary, ,�����ܽ�-Decl Summary}.

@item --defines=@var{defines-file}
��������ͬ,���Ǳ��浽�ļ�@var{defines-file}.

@item -b @var{file-prefix}
@itemx --file-prefix=@var{prefix}
@code{%verbose}��αװ,����,ָ������Bison����ļ���ǰ׺.
@xref{Decl Summary, ,�����ܽ�-Decl Summary}.

@item -r @var{things}
@itemx --report=@var{things}
��һ�����������ļ�д������@var{things}����ϸ������,���ɶ��ŷָ�:

@table @code
@item state
�﷨,��ͻ(����ĺ�δ�����)�Լ�@acronym{LALR}�Զ���.

@item look-ahead
����@code{state}��������ÿ������ĳ�ǰɨ��Ǻż��Զ���������.

@item itemset
����@code{state}��������ÿ��״̬��ȫ����Ŀ�����Զ������������������ĵ��Զ���.
@end table

����,��������﷨��

@item -v
@itemx --verbose
@code{%verbose}��αװ,����,����������ļ�д���﷨�ͷ���������ϸ����.
@xref{Decl Summary, ,�����ܽ�-Decl Summary}.

@item -o @var{filename}
@itemx --output=@var{filename}
Ϊ�������ļ�ָ��@var{filename}.

��������ļ���������@samp{-v}��@samp{-d}ѡ�������һ����@var{filename}����.

@item -g
���һ����Bison�����@acronym{LALR}(1)�﷨�Զ�����@acronym{VCG}����.
����﷨�ļ���@file{foo.y},
@acronym{VCG}����ļ�������@file{foo.vcg}.

@item --graph=@var{graph-file}
@var{--graph}����Ϊ��@samp{-g}����Ϊһ��.
Ψһ����������������һ��ָ�����ͼ���ļ��Ŀ�ѡ����.
@end table

@node Option Cross Key
@section ѡ����-Option Cross Key

������һ��ѡ���б�,���ճ�ѡ�����ĸ����,���������ҵ���Ӧ����дѡ��.

@tex
\def\leaderfill{\leaders\hbox to 1em{\hss.\hss}\hfill}

{\tt
\line{ --debug \leaderfill -t}
\line{ --defines \leaderfill -d}
\line{ --file-prefix \leaderfill -b}
\line{ --graph \leaderfill -g}
\line{ --help \leaderfill -h}
\line{ --name-prefix \leaderfill -p}
\line{ --no-lines \leaderfill -l}
\line{ --no-parser \leaderfill -n}
\line{ --output \leaderfill -o}
\line{ --token-table \leaderfill -k}
\line{ --verbose \leaderfill -v}
\line{ --version \leaderfill -V}
\line{ --yacc \leaderfill -y}
}
@end tex

@ifinfo
@example
--debug                               -t
--defines=@var{defines-file}          -d
--file-prefix=@var{prefix}                  -b @var{file-prefix}
--graph=@var{graph-file}              -d
--help                                -h
--name-prefix=@var{prefix}                  -p @var{name-prefix}
--no-lines                            -l
--no-parser                           -n
--output=@var{outfile}                      -o @var{outfile}
--token-table                         -k
--verbose                             -v
--version                             -V
--yacc                                -y
@end example
@end ifinfo

@node Yacc Library
@section Yacc��-Yacc Library

Yacc�����@code{yyerror}��@code{main}������Ĭ��ʵ��.
ͨ�������,��ЩĬ��ʵ��û��ʲô�ô�,����@acronym{POSIX}Ҫ������.
Ҫʹ��Yacc��,ʹ��ѡ��@option{-ly}������ĳ���.
ע�⵽Bisonʵ�ֵ�Yacc����@acronym{GNU}ͨ������֤�·���. 
(@pxref{Copying}).

�����ʹ��Yacc���@code{yyerror}����,
��Ӧ�����µ�����@code{yyerror}:

@example
int yyerror (char const *);
@end example

Bison����@code{yyerror}���ص�@code{int}ֵ.
�����ʹ��Yacc���@code{main}����,
���@code{yyparse}����Ӧ��������ԭ��:

@example
int yyparse (void);
@end example

@c ================================================= Invoking Bison

@node FAQ
@chapter ��������-Frequently Asked Questions
@cindex ��������(frequently asked questions)
@cindex ����(questions)

�������Bison�������ż������.
�����ᵽһЩ.

@menu
* ������ջ���(Parser Stack Overflow):Parser Stack Overflow.      ͻ��ջ����
* ����θ�λ������(How Can I Reset the Parser):How Can I Reset the Parser. @code{yyparse}����һЩ״̬
* �����ַ���(Strings are Destroyed):Strings are Destroyed.      @code{yylval}�������ַ�����׷��
* C++������(C++ Parsers):C++ Parsers.                ʹ��C++���������������
* ʵ��Gotos/Loops(Imlementing Gotos/Loops):Implementing Gotos/Loops.   �ڼ������п�����
@end menu

@node Parser Stack Overflow
@section ������ջ���-Parser Stack Overflow

@display
�ҵķ��������ش���@samp{parser stack overflow}����Ϣ.
������Щʲô?
@end display

��������Ѿ��������ط����۹���@xref{Recursion, ,Recursive Rules}.

@node How Can I Reset the Parser
@section ����θ�λ������-How Can I Reset the Parser

�������������������,������������͵�����:

@display
�ҵ�����@code{yyparse}���,
��������ȷʱ,����ȷ�ع���;
���ǵ�����һ�����������ʱ,���������ĵ���Ҳʧ����.
����β�������@code{yyparse}�Ĵ����־?
@end display

@noindent
����:

@display
�ҵķ�����������һ����@samp{#include}�������Ե�֧��.
���Ҵ�@code{yyparse}����@code{yyparse}ʱ,��ʹ��ָ������Ҫһ��@code{%pure-parser},
����Ȼ��ʧ��.
@end display

��Щ���͵����Ⲣ��������Bison�Լ����ǲ�����Lex���ɵ�ɨ����.
�����ٶȵ�Ŀ��,��Щɨ����ʹ�������ܴ�Ļ�����,
���ǿ��ܲ���ע�⵽�����ļ��ı仯.
��Ϊһ������,���������Դ�ļ�,

@file{first-line.l}:

@verbatim
%{
#include <stdio.h>
#include <stdlib.h>
%}
%%
.*\n    ECHO; return 1;
%%
int
yyparse (char const *file)
{
  yyin = fopen (file, "r");
  if (!yyin)
    exit (2);
  /* One token only.  */ /* ֻ��һ���Ǻ� */
  yylex ();
  if (fclose (yyin) != 0)
    exit (3);
  return 0;
}

int
main (void)
{
  yyparse ("input");
  yyparse ("input");
  return 0;
}
@end verbatim

@noindent
����ļ�@file{input}����

@verbatim
input:1: Hello,
input:2: World!
@end verbatim

@noindent
��ô�㲢δ����ȡ�õ�һ��,����:

@example
$ @kbd{flex -ofirst-line.c first-line.l}
$ @kbd{gcc  -ofirst-line   first-line.c -ll}
$ @kbd{./first-line}
input:1: Hello,
input:2: World!
@end example

���,����ʲôʱ��ı�@code{yyin},
��������Lex���Ƶ�ɨ����������ǰ�Ļ���ת�����µĻ�����.
�����������Lex��ʵ��;���Բ��������ĵ���ȡ������Ϣ.
����Flex,��ÿһ��@code{yyin}�ĸı�����@samp{YY_FLUSH_BUFFER}����������һ��.
������Flex����ɨ������Ҫ��ȡ��������������������ļ�����������,
����Կ���ʹ��FLex������@samp{yy_switch_to_buffer}�����ݶ�����뻺��.

������FLex����ɨ����ʹ���˿�ʼ����(@pxref{Start
conditions, , Start conditions, flex, The Flex Manual}),
�㻹���ܸ�λɨ����״̬,����,
ʹ��һ��@code{BEGIN (0)}����,�˻ص���ʼ����.

@node Strings are Destroyed
@section �����ٵ��ַ���-Strings are Destroyed

@display
�ҵķ��������������˾��ַ���,����������ʧȥ�˶����ǵ�׷��.
������@samp{"bar", "bar"}��������@samp{"foo\nbar", "bar"}������
����@samp{"foo", "bar"}.
@end display

�����������Ƿ��͵�Bison``���󱨸�''�б�����Ƶ����һ��,
����ֻ��һ����ɨ������ɫ���������.
�������µ�Lex����:

@verbatim
%{
#include <stdio.h>
char *yylval = NULL;
%}
%%
.*    yylval = yytext; return 1;
\n    /* IGNORE */ /* ���� */
%%
int
main ()
{
  /* Similar to using $1, $2 in a Bison action.  */
  /* ������Bison������ʹ�õ�$1,$2 */
  char *fst = (yylex (), yylval);
  char *snd = (yylex (), yylval);
  printf ("\"%s\", \"%s\"\n", fst, snd);
  return 0;
}
@end verbatim

�������벢��������δ���,��õ�:

@example
$ @kbd{flex -osplit-lines.c split-lines.l}
$ @kbd{gcc  -osplit-lines   split-lines.c -ll}
$ @kbd{printf 'one\ntwo\n' | ./split-lines}
"one
two", "two"
@end example

@noindent
��������@code{yytext}��һ���ڶ���������@emph{��ȡ}�Ļ�����,
���������Ҫ������,����븴����(����,ʹ��@code{strdup}).
Ӧע�⵽����������������Lexʵ����ô����@code{yytext}.
���統ָ����Lex������ѡ��@option{-l}(��������ѡ��@samp{%array}),
Flex�����˲�ͬ����Ϊ:

@example
$ @kbd{flex -l -osplit-lines.c split-lines.l}
$ @kbd{gcc     -osplit-lines   split-lines.c -ll}
$ @kbd{printf 'one\ntwo\n' | ./split-lines}
"two", "two"
@end example


@node C++ Parsers
@section C++������-C++ Parsers

@display
����β���ʹ��C++����ķ�����?
@end display

������������Bison��C++���,
���ǲ��ҵ���,����ȱ��ʱ��,�Ǽ���δ���.
���Ĺ��ܺ�ǿ��,�������ڶ෽��Ĺ�ϵ,
��@emph{����}�ƻ��������ԵĶ��⹤��.
����C++�Ǽ���δ�����ĵ�,
@c bad translation
���ǲ�����Ϊ�����Լ����볬����ӿ�Ŭ��,
@c up
�������,���ǻᾡ���Ŭ����֤������.

��һ�ֿ�����ʹ������C��������ʹ��C++���������б���.
������������һЩ��C++����,���粻�����������м���``��������''(����,
���й��캯���Ľṹ��),����Ϳ�����������.
���,��@code{%union}��Ӧ��ʹ��ָ�����ָ��.

@node Implementing Gotos/Loops
@section ʵ����ת/ѭ��-Implementing Gotos/Loops

@display
�ҵļ򵥼�����֧�ֱ���,��ֵ�ͺ���,
��������β���ʵ����ת��ѭ��?
@end display

��Ȼ����ĵ��а��������Ӻ��н�ѧ��,
����ģ���˷�����(���Ĺ����ǻָ����ֵĽṹ������ת��Ϊ����ģ��)
�ʹ�����Щ�ṹ�Ĺ���(��ִ��)֮�������.
���ڱ���Ϊֱ�����Գ����й�������.
����ֱ��ִ��ģʽ:һ����һ����ִ�м�ָ��.

@cindex �����﷨��(abstract syntax tree)
@cindex @acronym{AST}
�������Ҫ�ĸ��ḻ��ģʽ,
�������Ҫ��������һ�ֱ�ʾ��(ע:������)�Ѿ��ָ��Ľṹ����;
��������ͨ����Ϊ@dfn{�����﷨��(abstract syntax tree)}���߼�дΪ@dfn{@acronym{AST}}.
֮��,�ö��ַ�������������ἤ�������ִ�л���,
�����ջᵼ�²���һ����������߱�����.

������ⳬ��������ֲ�����۷�Χ,
���߿��Բ����ⷽ���ר������.


@c ================================================= Table of Symbols

@node Table of Symbols
@appendix Bison����-Bison Symbols
@cindex Bison����(Bison symbols), ����(table of)
@cindex Bison�еķ���(symbols in Bison), ����(table of)

@deffn {����} @@$
�ڶ�����,�������ֶ˵�λ��
@xref{Locations, ,λ�ø���-Locations Overview}.
@end deffn

@deffn {����} @@@var{n}
�ڶ�����,�����Ҷ˵�@var{n}�����ŵ�λ��.
@xref{Locations, ,λ�ø���-Locations Overview}.
@end deffn

@deffn {����} $$
�ڶ�����,������˵�����ֵ.
@xref{Actions, ,����-Actions}.
@end deffn

@deffn {����} $@var{n}
�ڶ�����,�����Ҷ˵�@var{n}�����ŵ�����ֵ.
@xref{Actions, ,����-Actions}.
@end deffn

@deffn {�ָ���} %%
���ڷָ��﷨���򲿷ֺ�Bison�������ֻ���@var{epilogue}����.
@xref{Grammar Layout, ,Bison�﷨�ļ��Ĳ���-The Overall Layout of a Bison Grammar}.
@end deffn

@c Don't insert spaces, or check the DVI output.
@deffn {�ָ���} %@{@var{code}%@}
��@samp{%@{}��@samp{%@}}֮��Ĵ��벻���κν��ͱ�ֱ�Ӹ��Ƶ�����ļ�.
��Щ��������������ļ���@var{Prologue}����.  
@xref{Grammar Outline, ,Bison�﷨�����-Outline of a Bison Grammar}.
@end deffn

@deffn {�ṹ} /*@dots{}*/
ע�ͷָ���,����C.
@end deffn

@deffn {�ָ���} :
�ָ������Ľ�������Ĳ���.
@xref{Rules, ,�����﷨������﷨-Syntax of Grammar Rules}.
@end deffn

@deffn {�ָ���} ;
����һ������.  @xref{Rules, ,�����﷨������﷨-Syntax of Grammar Rules}.
@end deffn

@deffn {�ָ���} |
�ָ�ͬһ�����ս������Ĳ�ͬ����.
@xref{Rules, ,�����﷨������﷨-Syntax of Grammar Rules}.
@end deffn

@deffn {����} $accept
Ԥ������ս��,
����Ψһ����Ϊ@samp{$accept: @var{start}
$end},
�����@var{start}�ǿ�ʼ����.
@xref{Start Decl, ,��ʼ����- The Start-Symbol}.
���������﷨��ʹ��.
@end deffn

@deffn {ָ��} %debug
�������������.  
@xref{Decl Summary, ,�����ܽ�-Decl Summary}.
@end deffn

@ifset defaultprec
@deffn {ָ��} %default-prec
��ȱ����ʽ@samp{%prec}���η��Ĺ�����һ�����ȼ�.
 @xref{Contextual Precedence, ,�������������ȼ�-Context-Dependent Precedence}.
@end deffn
@end ifset

@deffn {ָ��} %defines
Ϊɨ��������һ��ͷ�ļ���Bison����.
@xref{Decl Summary, ,�����ܽ�-Decl Summary}.
@end deffn

@deffn {ָ��} %destructor
ָ����������λ��ձ�����������ص��ڴ�.
@xref{Destructor Decl, ,�ͷŶ����ķ���- Freeing Discarded Symbols}.
@end deffn

@deffn {ָ��} %dprec
�ڷ�����ʱ�������һ�����ȼ��������Լ/��Լ��ͻ��Bison����.
@xref{GLR Parsers, ,��д@acronym{GLR}������-Writing @acronym{GLR} Parsers}.
@end deffn

@deffn {����} $end
���������������Ԥ����Ǻ�,�������﷨��ʹ��.
@end deffn

@deffn {����} error
һ�����������ڴ���ָ��ļǺ�����.
����Ǻſ��������﷨��������������Bison�������ڲ���ֹ������ǰ����
ʶ��һ������.
ʵ����,һ����������ľ��ӿɱ���Ϊ����Ч��.
����һ���﷨����ʱ,
�Ǻ�@code{error}��Ϊ�˵�ǰ�ĳ�ǰɨ��Ǻ�.
��@code{error}��Ӧ�Ķ�����ִ��,���ҳ�ǰɨ��Ǻű�����Ϊ
����������ļǺ�.
@xref{Error Recovery, ,����ָ�-Error Recovery}.
@end deffn

@deffn {ָ��} %error-verbose
�����߳�ģʽ��Bison����,
ָ���˵�����@code{yyerror}ʱ�Ĵ�����Ϣ�ַ���.
@end deffn

@deffn {ָ��} %file-prefix="@var{prefix}"
��������ļ�ǰ׺��Bison����.@xref{Decl Summary, ,�����ܽ�-Decl Summary}.
@end deffn

@deffn {ָ��} %glr-parser
����@acronym{GLR}��������Bison����.
@xref{GLR Parsers, ,��д@acronym{GLR}������-Writing @acronym{GLR} Parsers}.
@end deffn

@deffn {ָ��} %initial-action
�ڷ�����ǰ���д���.@xref{Initial Action Decl, ,�ڷ���ǰִ�ж���- Performing Actions before Parsing}.
@end deffn

@deffn {ָ��} %left
Ϊ������ָ�������Ե�Bison����.
@xref{Precedence Decl, ,���������ȼ�-Operator Precedence}.
@end deffn

@deffn {ָ��} %lex-param @{@var{argument-declaration}@}
ָ��@code{yylex}�Ķ��������Bison����.
@xref{Pure Calling, ,���������ĵ��ù���-Calling Conventions for Pure Parsers}.
@end deffn

@deffn {ָ��} %merge
�������һ���ϲ�������Bison����.
@c bad translation
�����һ����Լ/��Լ��ͻ�Ĺ��������ͬ�ĺϲ�����,
��ô���������Ӧ������������ֵ����õ�һ�Ľ��.
@c up
@xref{GLR Parsers, ,Writing @acronym{GLR} Parsers-��д@acronym{GLR}������}.
@end deffn

@deffn {ָ��} %name-prefix="@var{prefix}"
�������ⲿ���ŵ�Bison����.@xref{Decl Summary, ,�����ܽ�-Decl Summary}.
@end deffn

@ifset defaultprec
@deffn {ָ��} %no-default-prec
��ָ��ȱ����ʽ@samp{%prec}���η�����������ȼ�.
@xref{Contextual Precedence, ,�������������ȼ�-Context-Dependent Precedence}.
@end deffn
@end ifset

@deffn {ָ��} %no-lines
�ڷ������ļ��б������@code{#line}ָ���Bison����. @xref{Decl Summary, ,�����ܽ�-Decl Summary}.
@end deffn

@deffn {ָ��} %nonassoc
����һ���޽���ԼǺ�.
@xref{Precedence Decl, ,���������ȼ�-Operator Precedence}.
@end deffn

@deffn {ָ��} %output="@var{filename}"
���÷������ļ���Bison����  @xref{Decl Summary, ,�����ܽ�-Decl Summary}.
@end deffn

@deffn {ָ��} %parse-param @{@var{argument-declaration}@}
ָ��@code{yyparse}���ܵĶ��������Bison����.
@xref{Parser Function, ,����������@code{yyparse}- The Parser Function @code{yyparse}}.
@end deffn

@deffn {ָ��} %prec
���ض��Ĺ���ָ�����ȼ���Bison����.
@xref{Contextual Precedence, ,�������������ȼ�-Context-Dependent Precedence}.
@end deffn

@deffn {ָ��} %pure-parser
����һ����(������)��������Bison����.
@xref{Pure Decl, ,һ����(������)������-A Pure (Reentrant) Parser}.
@end deffn

@deffn {ָ��} %right
ָ���Ǻ��ҽ���Ե�Bison����.
@xref{Precedence Decl, ,���������ȼ�-Operator Precedence}.
@end deffn

@deffn {ָ��} %start
ָ����ʼ���ŵ�Bison����@xref{Start Decl, ,��ʼ����-The Start-Symbol}.
@end deffn

@deffn {ָ��} %token
�����Ǻŵ���ָ�����ȼ�.
@xref{Token Decl, ,�Ǻ���������-Token Type Names}.
@end deffn

@deffn {ָ��} %token-table
�ڷ������ļ��м���������Ʊ���Bison����.
@xref{Decl Summary, ,�����ܽ�-Decl Summary}.
@end deffn

@deffn {ָ��} %type
�������ս����Bison����.
@xref{Type Decl, ,���ս��-Nonterminal Symbols}.
@end deffn

@deffn {����} $undefined
����@code{yylex}���ص�δ����ֵ��ӳ�䵽���Ԥ�������.
���������﷨��ʹ��,[untranslated]rather,use @code{error}.
@end deffn

@deffn {ָ��} %union
ָ�����ֿ�������ֵ�������͵�Bison����.
@xref{Union Decl, ,ֵ���ͼ�-The Collection of Value Types}.
@end deffn

@deffn {��} YYABORT
ͨ��ʹ@code{yyparse}��������1,��αװ����һ��δ�ָ����﷨����ĺ�.
�������ô��󱨸溯��@code{yyerrpr}.
@xref{Parser Function, ,����������@code{ppyarse}-The Parser Function @code{yyparse}}.
@end deffn

@deffn {��} YYACCEPT
ͨ��ʹ@code{yyparse}��������0,��αװ���Ե�һ�������ı����Ѿ�����ȡ�ĺ�.
@xref{Parser Function, ,����������@code{ppyarse}-The Parser Function @code{yyparse}}.
@end deffn

@deffn {��} YYBACKUP
�ӷ�����ջ�ж���һ��ֵ��α��һ����ǰɨ��Ǻŵĺ�.
@xref{Action Features, ,�ڶ�����ʹ�õ���������-Special Features for Use in Actions}.
@end deffn

@deffn {����} yychar
������ǰ��ǰɨ��Ǻŵ�����ֵ���ⲿ��������.
(��һ������������,����һ����@code{yyparse}�еľֲ�����).
����ָ��������Ҫ����������.
@xref{Action Features, ,�ڶ�����ʹ�õ���������-Special Features for Use in Actions}.
@end deffn

@deffn {����} yyclearin
�ڴ���ָ�������ʹ�õĺ�.�������ǰ�ĳ�ǰɨ��Ǻ�.
@xref{Error Recovery, ,����ָ�-Error Recovery}.
@end deffn

@deffn {��} YYDEBUG
ʹ����������׷�ٴ���ĺ�.
@xref{Tracing, ,������ķ�����-Tracing Your Parser}.
@end deffn

@deffn {����} yydebug
Ĭ�ϱ���0���ⲿ��������.
���@code{yydebug}������һ������ֵ,
���������������������źͷ�������������Ϣ.
@xref{Tracing, ,������ķ�����-Tracing Your Parser}.
@end deffn

@deffn {��} yyerrok
ʹ��������һ���﷨����֮�������ָ�������ģʽ�ĺ�.
@xref{Error Recovery, ,����ָ�-Error Recovery}.
@end deffn

@deffn {��} YYERROR
һ����װ�ոշ���һ���﷨����ĺ�:
����@code{yyerror}Ȼ��ִ��ͨ���Ĵ���ָ�������ܵĻ�(@pxref{Error Recovery, ,����ָ�-Error Recovery})
����(����ָ��ǲ����ܵ�)ʹ@code{yyparse}����1.
@xref{Error Recovery, ,����ָ�-Error Recovery}.
@end deffn

@deffn {����} yyerror
�û��ṩ�ĵ����ִ���ʱ��@code{yyparse}���õĺ���.
@xref{Error Reporting, ,���󱨸溯��@code{yyerror}-The Error Reporting Function @code{yyerror}}.
@end deffn

@deffn {��} YYERROR_VERBOSE
һ����@var{Prologue}������@code{#define}����ĳ¾ɵĺ�,
������@code{yyerror}ʱ,��������ϸ�Ĵ�����Ϣ�ַ���.
���@code{YYERROR_VERBOSE}�����ʲô������û��Ӱ��,
��Ӱ���ֻ�����Ƿ�������.
ʹ��@code{%error-verbose}�Ǹ��õ�ѡ��.
@end deffn

@deffn {��} YYINITDEPTH
ָ��������ջ��ʼ��С�ĺ�.
@xref{Stack Overflow, ,ջ���-Stack Overflow}.
@end deffn

@deffn {����} yylex
�û��ṩ�Ĵʷ�����������,
�������κβ����������һ���Ǻ�.
@xref{Lexical, ,�ʷ�����������@code{yylex}-The Lexical Analyzer Function @code{yylex}}.
@end deffn

@deffn {��} YYLEX_PARAM
һ������ָ��@code{yyparse}���ݵ�@code{yylex}�Ķ������(���߶�������б�)�ĳ¾ɵĺ�.
���޳ɼ���ʹ�������,��ֻ��Yacc���Ʒ�����֧��.
@xref{Pure Calling, ,���������ĵ��ù���-Calling Conventions for Pure Parsers}.
@end deffn

@deffn {����} yylloc
@code{yylex}Ӧ�ý�һ���Ǻŵ����кŷ�������ⲿ����.  
(�ڴ���������,����һ��@code{yyparse}�ľֲ�����,
���ĵ�ַ�����ݵ�@code{yylex}).
��������﷨�����в�ʹ��@samp{@@}����,����Ժ����������.
@xref{Token Locations, ,�Ǻŵ�����λ��-Textual Locations of Tokens}.
@end deffn

@deffn {Type} YYLTYPE
@code{yyloc}����������;Ĭ�ϵ�Ϊһ�������ĸ���Ա�Ľṹ��.
@xref{Location Type, ,λ�õ���������-Data Types of Locations}.
@end deffn

@deffn {����} yylval
@code{yylex}Ӧ�ý��Ǻ���ص�����ֵ�����������.
(�ڴ���������,����һ��@code{yyparse}�еľֲ�����,�������ĵ�ַ�����ݵ�@code{yylex}.)
@xref{Token Values, ,�Ǻŵ�����ֵ-Semantic Values of Tokens}.
@end deffn

@deffn {��} YYMAXDEPTH
ָ��������ջ����ݵĺ�.
@xref{Stack Overflow, ,ջ���-Stack Overflow}.
@end deffn

@deffn {����} yynerrs
һ��ȫ�ֱ���,ÿ�γ����﷨����ʱ����1.
(�ڴ���������,����һ��@code{yyparse}�еľֲ�����.)
@xref{Error Reporting, ,���󱨸溯��@code{yyerror}-The Error Reporting Function @code{yyerror}}.
@end deffn

@deffn {����} yyparse
Bison�����ķ���������;�������������ʼ����.
@xref{Parser Function, ,����������@code{yyparse}-The Parser Function @code{yyparse}}.
@end deffn

@deffn {��} YYPARSE_PARAM
ָ��@code{yyparse}Ӧ�ý��ܵĲ������ɵĳ¾ɺ�.
���޳ɼ���ʹ�������,��ֻ��Yacc���Ʒ�����֧��.
@xref{Pure Calling, ,���������ĵ��ù���-Calling Conventions for Pure Parsers}.
@end deffn

@deffn {��} YYRECOVERING
һ����,����ֵָ���˷������Ƿ����ڴӴ����лָ�.
@xref{Action Features, ,������ʹ�õ���������-Special Features for Use in Actions}.
@end deffn

@deffn {��} YYSTACK_USE_ALLOCA
���ڿ��Ƶ�C����@acronym{LALR}(1)��������Ҫ��չ����ջʱ,@code{alloca}��ʹ��.
�������Ϊ0,��������ʹ��@code{malloc}����չ����ջ.
�������Ϊ1,���������ʹ��@code{alloca}.
����0��1�����ֵ��������Bison�Ժ����չ.
���û�б�����,
@code{YYSTACK_USA_ALLOCA}Ĭ��Ϊ0.

����㶨��@code{YYSTACK_USE_ALLOCA}Ϊ1,
��������ʹ@code{alloca}�ǿɼ���,
����,ʹ��@acronym{GCC},���߰���@code{<stdlib.h>}.
����,�ڸ���ͨ�������,
�����Ĵ������������һ������ջ�����Ͳ�������ջ������������ϵ�ʱ��,
��Ӧ��@code{YYMAXDEPTH}��Ϊ������@code{alloca}ʱ,
��һ�����κ�Ŀ�������������ջ�����ֵ.
����Լ��Bison���ɵĴ����������ʵ�����ֵ.
����Ҫ�ڵײ���ϸʵ�ֵ�רҵ����.

@end deffn

@deffn {����} YYSTYPE
����ֵ����������;Ĭ��Ϊ@code{int}.
@xref{Value Type, ,����ֵ����������-Data Types of Semantic Values}.
@end deffn

@node Glossary
@appendix �ʻ��-Glossary
@cindex �ʻ��(glossary)

@table @asis
@item Backus-Naur Form (@acronym{BNF}; also called ``Backus Normal Form'')
@item Backus-Naur ��ʽ (@acronym{BNF}; Ҳ����Ϊ ``Backus���淶ʽ'')
��John Backus������,������������������޹��ķ�����ʽ����.
��Peter Naur���ĳ�ΪAlgol60�����1960-01-02ίԱ���ĵ��еõ������Ľ�.
@xref{Language and Grammar, ,�������������޹��ķ�-Languages and Context-Free Grammars}.

@item Context-free grammars
@item �������޹��ķ�
��������ʹ�ö������������ĵĹ�����ķ�.
���,�����һ������˵һ����������Ϊһ������ʽʹ��,
��ô,����@emph{���κεط�}����һ�������ı���ʽ.
@xref{Language and Grammar, ,�������������޹��ķ�-Languages and Context-Free Grammars}.

@item Dynamic allocation
@item ��̬����
��ִ���ڼ�����ڴ�,�������ڱ����ڼ���߽���һ������ʱ.

@item Empty string
@item ���ַ���
ģ�⼯�����еĿռ�,
���ַ����ǳ���Ϊ0���ַ���.

@item Finite-state stack machine
@item ����״̬ջ��
һ�ֺ��ж�����ɢ״̬�Ļ���,ÿ��ʱ��ֻ��һ��״̬.
�����������ʱ��,�������ջ����߼���ָ����һ��״̬ת������һ��״̬.
���ڷ�������˵,�������Ҫ����������,
״̬��Ӧ���﷨�����еĸ����׶�.
@xref{Algorithm, ,Bison�������㷨-The Bison Parser Algorithm}.

@item Generalized @acronym{LR} (@acronym{GLR})
@item ͨ��@acronym{LR} (@acronym{GLR})
һ�ֿ��Դ���������Щ����@acronym{LALR}(1)���������޹��ķ��ķ����㷨.
���������Bisonͨ����@acronym{LALR}(1)�㷨���ܽ���ĳ�ͻ.
����Ч�ط��ѳɶ��������,�������п��ܵķ���,������Щ�ڶ�����������ʾ��ʧ�ܵķ�����.
@xref{Generalized LR Parsing, ,ͨ��@acronym{LR}����-Generalized @acronym{LR} Parsing}.

@item Grouping
@item ����
һ��(ͨ��)���﷨�Ͽ��ٷֵ����Խṹ;
����C�е�`expression'����'declaration'.
@xref{Language and Grammar, ,���Ժ��������޹��ķ�-Languages and Context-Free Grammars}.

@item Infix operator
@item ��׺������
�����ڲ������м�ָ��ĳЩ����������������.


@item Input stream
@item ������
���豸�����������������.

@item Language construct
@item ���Խṹ
һ�����Եĵ���Ӧ��ģʽ.
����,һ��C���ԵĽṹ��@code{if}���.
@xref{Language and Grammar, ,���Ժ��������޹��ķ�-Languages and Context-Free Grammars}.

@item Left associativity
@item ������
ӵ�������ԵĲ��������������ҵط���:
@samp{a+b+C}���ȼ���@samp{a+b}Ȼ���@samp{c}һ�����.
@xref{Precedence, ,���������ȼ�-Operator Precedence}.

@item Left recursion
@item ��ݹ�
һ���������ͬ���ǵ�һ���������ŵĹ���;
����:
@samp{expseq1 : expseq1 ',' exp;}.  
@xref{Recursion, ,�ݹ����-Recursive Rules}.

@item Left-to-right parsing
@item �������ҷ���
ͬ���������ҷ���һ�����ط����Ǻ�������һ������.
@xref{Algorithm, ,Bison �������㷨-The Bison Parser Algorithm}.

@item Lexical analyzer (scanner)
@item �ʷ������� (ɨ����)
һ����ȡ��������������ؼǺŵĺ���.
@xref{Lexical, ,�ʷ�����������@code{yylex}-The Lexical Analyzer Function @code{yylex}}.


@item Lexical tie-in
@item �ʷ�����
һ�����﷨���������õı�־�����ı�����Ǻŵķ���.
@xref{Lexical Tie-ins, ,�ʷ�����-Lexical tie-in}.

@item Literal string token
@item �ַ������ּǺ�
һ�����������߸����ַ���ɵļǺ�.@xref{Symbols, ,����-Symbols}.

@item Look-ahead token
@item ��ǰɨ��Ǻ�
һ���Ѿ���ȡ��δ�ƽ��ļǺ�.
@xref{Look-Ahead, ,��ǰɨ��Ǻ�-Look-Ahead Tokens}.

@item @acronym{LALR}(1)
һ��Bison(����������������һ��)���Դ������������޹��ķ�.
@acronym{LR}(1)���Ӽ�.
@xref{Mystery Conflicts, ,�����Ի�Ĺ�Լ/��Լ��ͻ-Mysterious Reduce/Reduce Conflicts}.

@item @acronym{LR}(1)
һ���������޹��ķ�,
���ڴ����ʱ����Ҫһ����ǰɨ��Ǻ��������κ�����Ƭ�ε�����.

@item Nonterminal symbol
@item ���ս��
һ����������ͨ���������Ϊ��С�ṹ���﷨�ṹ;
���仰˵,һ�����ǼǺŵĽṹ.
@xref{Symbols, ,����-Symbols}.

@item Parser
@item ������
һ���������Ӵʷ����������ݹ����ļǺŵ��﷨�ṹ��ʶ����Ч���ӵĺ���.

@item Postfix operator
@item ��׺������
�����ڲ�������ִ��ĳЩ����������������.

@item Reduction
@item ��Լ
����һ���﷨���򽫷��ս����/���ս���������滻Ϊ���ս��.
@xref{Algorithm, ,Bison�������㷨-The Bison Parser Algorithm}.

@item Reentrant
@item ������
һ����������ӳ�����һ�����Ա�����εز��е��ò��ҵ��ü��໥�����ŵ��ӳ���.
@xref{Pure Decl, ,һ����(������)������-A Pure (Reentrant) Parser}.

@item Reverse polish notation
@item �沨���Ǻ�
һ�����в��������Ǻ�׺������������.

@item Right recursion
@item �ҵݹ�
һ������Ǻ�Ҳ������󲿼��ǺŵĹ���;
���� @samp{expseq1: exp ',' expseq1;}.
@xref{Recursion, ,�ݹ����-Recursive rules}.

@item Semantics-����
�ڼ����������,������ÿ������ʵ���Ķ���ָ��,
����,ÿ����������.
@xref{Semantics, ,�������Ե�����-Defining Language Semantics}.

@item Shift-�ƽ�
����˵һ���������ƽ����������������н�һ���������������
������ԼһЩ�Ѿ�ʶ��Ĺ���.
@xref{Algorithm, ,Bison�������㷨-The Bison Parser Algorithm}.

@item Single-character literal
@item ���ַ�����
һ����ʶ��ͽ���Ϊ���Լ��ĵ�һ�ַ�.
@xref{Grammar in Bison, ,�������ķ�ת����Bison����-From Formal Rules to Bison Input}.

@item Start symbol
@item ��ʼ����
����Ҫ�������Ե�һ��������Ч�ı����ķ��ս��.
������������,��ʼ����ͨ������Ϊ��һ�����ս��.
@xref{Start Decl, ,��ʼ����-The Start-Symbol}.

@item Symbol table
@item ���ű�
����ʶ���ʹ���Ѿ����ڵķ�����Ϣ�����ݽṹ.
�ڽ��з��������ű��洢�������ƺ��������.
@xref{Multi-function Calc, ,�๦�ܼ�����-Multi-function Calc}.

@item Syntax error
@item �﷨����
һ�������ڷ�����Ч�﷨��������ʱ�Ĵ���.  
@xref{Error Recovery, ,����ָ�-Error Recovery}.

@item Token
@item �Ǻ�
һ�������Ĳ����ٷֵ����Ե�Ԫ.
���﷨��,����һ���Ǻŵķ������ս��.
Bison�����������������Դʷ��������ļǺ���.
@xref{Symbols, ,Symbols-����}.

@item Terminal symbol
@item �ս��
���﷨�в���������������﷨�ϲ����ٷֵ��﷨����.
����ʾ������Ƭ����һ���Ǻ�.
@xref{Language and Grammar, ,�������������޹��ķ�-Languages and Context-Free Grammars}.
@end table

@node Copying This Manual
@appendix ��������ֲ�-Copying This Manual

@menu
* GNU Free Documentation License::  ��������ֲ������.
@end menu

@include fdl.texi

@node Index
@unnumbered ����-Index

@printindex cp

@bye

@c LocalWords: texinfo setfilename settitle setchapternewpage finalout
@c LocalWords: ifinfo smallbook shorttitlepage titlepage GPL FIXME iftex
@c LocalWords: akim fn cp syncodeindex vr tp synindex dircategory direntry
@c LocalWords: ifset vskip pt filll insertcopying sp ISBN Etienne Suvasa
@c LocalWords: ifnottex yyparse detailmenu GLR RPN Calc var Decls Rpcalc
@c LocalWords: rpcalc Lexer Gen Comp Expr ltcalc mfcalc Decl Symtab yylex
@c LocalWords: yyerror pxref LR yylval cindex dfn LALR samp gpl BNF xref
@c LocalWords: const int paren ifnotinfo AC noindent emph expr stmt findex
@c LocalWords: glr YYSTYPE TYPENAME prog dprec printf decl init stmtMerge
@c LocalWords: pre STDC GNUC endif yy YY alloca lf stddef stdlib YYDEBUG
@c LocalWords: NUM exp subsubsection kbd Ctrl ctype EOF getchar isdigit
@c LocalWords: ungetc stdin scanf sc calc ulator ls lm cc NEG prec yyerrok
@c LocalWords: longjmp fprintf stderr preg yylloc YYLTYPE cos ln
@c LocalWords: smallexample symrec val tptr FNCT fnctptr func struct sym
@c LocalWords: fnct putsym getsym fname arith fncts atan ptr malloc sizeof
@c LocalWords: strlen strcpy fctn strcmp isalpha symbuf realloc isalnum
@c LocalWords: ptypes itype YYPRINT trigraphs yytname expseq vindex dtype
@c LocalWords: Rhs YYRHSLOC LE nonassoc op deffn typeless typefull yynerrs
@c LocalWords: yychar yydebug msg YYNTOKENS YYNNTS YYNRULES YYNSTATES
@c LocalWords: cparse clex deftypefun NE defmac YYACCEPT YYABORT param
@c LocalWords: strncmp intval tindex lvalp locp llocp typealt YYBACKUP
@c LocalWords: YYEMPTY YYRECOVERING yyclearin GE def UMINUS maybeword
@c LocalWords: Johnstone Shamsa Sadaf Hussain Tomita TR uref YYMAXDEPTH
@c LocalWords: YYINITDEPTH stmnts ref stmnt initdcl maybeasm VCG notype
@c LocalWords: hexflag STR exdent itemset asis DYYDEBUG YYFPRINTF args
@c LocalWords: YYPRINTF infile ypp yxx outfile itemx vcg tex leaderfill
@c LocalWords: hbox hss hfill tt ly yyin fopen fclose ofirst gcc ll
@c LocalWords: yyrestart nbar yytext fst snd osplit ntwo strdup AST
@c LocalWords: YYSTACK DVI fdl printindex
